Blame
Date:
Fri Jun 10 07:30:11 2022 UTC
Message:
s/player_setrate/player_setup when the function was renamed, the error messages weren't.
001
2022-02-16
op
/*
002
2022-02-16
op
* Copyright (c) 2022 Omar Polo <op@openbsd.org>
003
2022-02-16
op
*
004
2022-02-16
op
* Permission to use, copy, modify, and distribute this software for any
005
2022-02-16
op
* purpose with or without fee is hereby granted, provided that the above
006
2022-02-16
op
* copyright notice and this permission notice appear in all copies.
007
2022-02-16
op
*
008
2022-02-16
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2022-02-16
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2022-02-16
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2022-02-16
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2022-02-16
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2022-02-16
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2022-02-16
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2022-02-16
op
*/
016
2022-02-16
op
017
2022-02-16
op
#include <sys/types.h>
018
2022-02-16
op
#include <sys/queue.h>
019
2022-02-16
op
#include <sys/uio.h>
020
2022-02-16
op
021
2022-02-16
op
#include <err.h>
022
2022-02-16
op
#include <event.h>
023
2022-02-16
op
#include <inttypes.h>
024
2022-02-16
op
#include <limits.h>
025
2022-02-16
op
#include <stdio.h>
026
2022-02-16
op
#include <stdlib.h>
027
2022-02-16
op
#include <stdint.h>
028
2022-02-16
op
#include <imsg.h>
029
2022-02-16
op
030
2022-02-16
op
#include <FLAC/stream_decoder.h>
031
2022-02-16
op
032
2022-02-16
op
#include "amused.h"
033
2022-02-18
op
#include "log.h"
034
2022-02-16
op
035
2022-02-16
op
static FLAC__StreamDecoderWriteStatus
036
2022-02-16
op
writecb(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame,
037
2022-03-25
op
const int32_t * const *src, void *data)
038
2022-02-16
op
{
039
2022-02-16
op
static uint8_t buf[BUFSIZ];
040
2022-03-25
op
int c, i, bps, chans;
041
2022-02-16
op
size_t len;
042
2022-02-16
op
043
2022-03-25
op
bps = frame->header.bits_per_sample;
044
2022-03-25
op
chans = frame->header.channels;
045
2022-03-25
op
046
2022-02-16
op
for (i = 0, len = 0; i < frame->header.blocksize; ++i) {
047
2022-03-25
op
if (len + 4*chans >= sizeof(buf)) {
048
2022-03-09
op
if (!play(buf, len))
049
2022-03-09
op
goto quit;
050
2022-03-13
op
len = 0;
051
2022-02-16
op
}
052
2022-02-16
op
053
2022-03-25
op
for (c = 0; c < chans; ++c) {
054
2022-03-25
op
switch (bps) {
055
2022-03-25
op
case 8:
056
2022-03-25
op
buf[len++] = src[c][i] & 0xff;
057
2022-03-25
op
break;
058
2022-03-25
op
case 16:
059
2022-03-25
op
buf[len++] = src[c][i] & 0xff;
060
2022-03-25
op
buf[len++] = (src[c][i] >> 8) & 0xff;
061
2022-03-25
op
break;
062
2022-03-25
op
case 24:
063
2022-03-25
op
case 32:
064
2022-03-25
op
buf[len++] = src[c][i] & 0xff;
065
2022-03-25
op
buf[len++] = (src[c][i] >> 8) & 0xff;
066
2022-03-25
op
buf[len++] = (src[c][i] >> 16) & 0xff;
067
2022-03-25
op
buf[len++] = (src[c][i] >> 24) & 0xff;
068
2022-03-25
op
break;
069
2022-03-25
op
default:
070
2022-03-25
op
log_warnx("unsupported flac bps=%d", bps);
071
2022-03-25
op
goto quit;
072
2022-03-25
op
}
073
2022-03-25
op
}
074
2022-02-16
op
}
075
2022-02-16
op
076
2022-03-09
op
if (len != 0 && !play(buf, len))
077
2022-03-09
op
goto quit;
078
2022-02-16
op
079
2022-02-16
op
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
080
2022-03-09
op
quit:
081
2022-03-09
op
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
082
2022-02-16
op
}
083
2022-02-16
op
084
2022-02-16
op
static void
085
2022-02-16
op
metacb(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *meta,
086
2022-02-16
op
void *d)
087
2022-02-16
op
{
088
2022-02-16
op
uint32_t sample_rate;
089
2022-03-25
op
int channels, bits;
090
2022-02-16
op
091
2022-02-16
op
if (meta->type == FLAC__METADATA_TYPE_STREAMINFO) {
092
2022-03-25
op
bits = meta->data.stream_info.bits_per_sample;
093
2022-02-16
op
sample_rate = meta->data.stream_info.sample_rate;
094
2022-02-18
op
channels = meta->data.stream_info.channels;
095
2022-02-16
op
096
2022-03-25
op
if (player_setup(bits, sample_rate, channels) == -1)
097
2022-06-10
op
err(1, "player_setup");
098
2022-02-16
op
}
099
2022-02-16
op
}
100
2022-02-16
op
101
2022-02-16
op
static void
102
2022-06-09
op
errcb(const FLAC__StreamDecoder *decoder,
103
2022-06-09
op
FLAC__StreamDecoderErrorStatus status, void *data)
104
2022-02-16
op
{
105
2022-06-09
op
log_warnx("flac error: %s",
106
2022-06-09
op
FLAC__StreamDecoderErrorStatusString[status]);
107
2022-02-16
op
}
108
2022-02-16
op
109
2022-03-09
op
int
110
2022-02-16
op
play_flac(int fd)
111
2022-02-16
op
{
112
2022-02-16
op
FILE *f;
113
2022-02-18
op
int s, ok = 1;
114
2022-02-18
op
const char *state;
115
2022-02-16
op
FLAC__StreamDecoder *decoder = NULL;
116
2022-02-16
op
FLAC__StreamDecoderInitStatus init_status;
117
2022-02-16
op
118
2022-02-16
op
if ((f = fdopen(fd, "r")) == NULL)
119
2022-02-16
op
err(1, "fdopen");
120
2022-02-16
op
121
2022-02-16
op
decoder = FLAC__stream_decoder_new();
122
2022-02-16
op
if (decoder == NULL)
123
2022-02-16
op
err(1, "flac stream decoder");
124
2022-02-16
op
125
2022-02-16
op
FLAC__stream_decoder_set_md5_checking(decoder, 1);
126
2022-02-16
op
127
2022-02-16
op
init_status = FLAC__stream_decoder_init_FILE(decoder, f, writecb,
128
2022-02-16
op
metacb, errcb, NULL);
129
2022-02-16
op
if (init_status != FLAC__STREAM_DECODER_INIT_STATUS_OK)
130
2022-02-16
op
errx(1, "flac decoder: %s",
131
2022-02-16
op
FLAC__StreamDecoderInitStatusString[init_status]);
132
2022-02-16
op
133
2022-02-16
op
ok = FLAC__stream_decoder_process_until_end_of_stream(decoder);
134
2022-02-18
op
s = FLAC__stream_decoder_get_state(decoder);
135
2022-03-09
op
136
2022-03-09
op
FLAC__stream_decoder_delete(decoder);
137
2022-03-09
op
fclose(f);
138
2022-03-09
op
139
2022-03-13
op
if (s == FLAC__STREAM_DECODER_ABORTED)
140
2022-03-13
op
return 1;
141
2022-03-13
op
else if (!ok) {
142
2022-02-18
op
state = FLAC__StreamDecoderStateString[s];
143
2022-02-18
op
log_warnx("decoding failed; state: %s", state);
144
2022-03-09
op
return -1;
145
2022-03-13
op
} else
146
2022-03-13
op
return 0;
147
2022-02-16
op
}
Omar Polo