本文整理汇总了C++中MAD_NCHANNELS函数的典型用法代码示例。如果您正苦于以下问题:C++ MAD_NCHANNELS函数的具体用法?C++ MAD_NCHANNELS怎么用?C++ MAD_NCHANNELS使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MAD_NCHANNELS函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: mp3_send_pcm
/**
* Sends the synthesized current frame via decoder_data().
*/
static enum decoder_command
mp3_send_pcm(struct mp3_data *data, unsigned i, unsigned pcm_length)
{
unsigned max_samples;
max_samples = sizeof(data->output_buffer) /
sizeof(data->output_buffer[0]) /
MAD_NCHANNELS(&(data->frame).header);
while (i < pcm_length) {
enum decoder_command cmd;
unsigned int num_samples = pcm_length - i;
if (num_samples > max_samples)
num_samples = max_samples;
i += num_samples;
mad_fixed_to_24_buffer(data->output_buffer,
&data->synth,
i - num_samples, i,
MAD_NCHANNELS(&(data->frame).header));
num_samples *= MAD_NCHANNELS(&(data->frame).header);
cmd = decoder_data(data->decoder, data->input_stream,
data->output_buffer,
sizeof(data->output_buffer[0]) * num_samples,
data->bit_rate / 1000);
if (cmd != DECODE_COMMAND_NONE)
return cmd;
}
return DECODE_COMMAND_NONE;
}
开发者ID:Acidburn0zzz,项目名称:mpd,代码行数:36,代码来源:mad_decoder_plugin.c
示例2: mp3_mad_decode
void
mp3_mad_decode (mp3_info_t *info) {
// copy synthesized samples into readbuffer
int idx = info->mad_synth.pcm.length-info->buffer.decode_remaining;
// stereo
if (MAD_NCHANNELS(&info->mad_frame.header) == 2 && info->info.fmt.channels == 2) {
while (info->buffer.decode_remaining > 0 && info->buffer.readsize > 0) {
*((int16_t*)info->buffer.out) = MadFixedToSshort (info->mad_synth.pcm.samples[0][idx]);
info->buffer.readsize -= 2;
info->buffer.out += 2;
*((int16_t*)info->buffer.out) = MadFixedToSshort (info->mad_synth.pcm.samples[1][idx]);
info->buffer.readsize -= 2;
info->buffer.out += 2;
info->buffer.decode_remaining--;
idx++;
}
}
// mono
else if (MAD_NCHANNELS(&info->mad_frame.header) == 1 && info->info.fmt.channels == 1){
while (info->buffer.decode_remaining > 0 && info->buffer.readsize > 0) {
*((int16_t*)info->buffer.out) = MadFixedToSshort (info->mad_synth.pcm.samples[0][idx]);
info->buffer.readsize -= 2;
info->buffer.out += 2;
info->buffer.decode_remaining--;
idx++;
}
}
// workaround for bad mp3s that have both mono and stereo frames
else if (MAD_NCHANNELS(&info->mad_frame.header) == 1 && info->info.fmt.channels == 2) {
while (info->buffer.decode_remaining > 0 && info->buffer.readsize > 0) {
int16_t sample = MadFixedToSshort (info->mad_synth.pcm.samples[0][idx]);
*((int16_t*)info->buffer.out) = sample;
info->buffer.readsize -= 2;
info->buffer.out += 2;
*((int16_t*)info->buffer.out) = sample;
info->buffer.readsize -= 2;
info->buffer.out += 2;
info->buffer.decode_remaining--;
idx++;
}
}
else if (MAD_NCHANNELS(&info->mad_frame.header) == 2 && info->info.fmt.channels == 1) {
while (info->buffer.decode_remaining > 0 && info->buffer.readsize > 0) {
int16_t sample = MadFixedToSshort (info->mad_synth.pcm.samples[0][idx]);
*((int16_t*)info->buffer.out) = sample;
info->buffer.readsize -= 2;
info->buffer.out += 2;
info->buffer.decode_remaining--;
idx++;
}
}
}
开发者ID:dHRUSHIT,项目名称:deadbeef,代码行数:52,代码来源:mp3_mad.c
示例3: _inStream
Mp3PspStream::Mp3PspStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
_inStream(inStream),
_disposeAfterUse(dispose),
_pcmLength(0),
_posInFrame(0),
_state(MP3_STATE_INIT),
_length(0, 1000),
_sampleRate(0),
_totalTime(mad_timer_zero) {
DEBUG_ENTER_FUNC();
assert(_decoderInit); // must be initialized by now
// let's leave the buffer guard -- who knows, it may be good?
memset(_buf, 0, sizeof(_buf));
memset(_codecInBuffer, 0, sizeof(_codecInBuffer));
initStream(); // init needed stuff for the stream
findValidHeader(); // get a first header so we can read basic stuff
_sampleRate = _header.samplerate; // copy it before it gets destroyed
_stereo = (MAD_NCHANNELS(&_header) == 2);
while (_state != MP3_STATE_EOS)
findValidHeader(); // get a first header so we can read basic stuff
_length = Timestamp(mad_timer_count(_totalTime, MAD_UNITS_MILLISECONDS), getRate());
deinitStream();
_state = MP3_STATE_INIT;
}
开发者ID:MatChung,项目名称:scummvm-ps3,代码行数:34,代码来源:mp3.cpp
示例4: mp3_read
static int mp3_read (song_s *song, char *buffer)
{
static int i;
static int ret;
static struct audio_dither dither;
static char buffer2[BUF_SIZE];
static char *out_ptr = buffer2;
static char *out_buf_end = buffer2 + BUF_SIZE;
mp3_s *mp3 = song->songlib->mp3;
mad_timer_add (&mp3->timer, mp3->frame.header.duration);
mad_synth_frame (&mp3->synth, &mp3->frame);
mp3->elapsed_time = ((float)mad_timer_count (mp3->timer, MAD_UNITS_MILLISECONDS))/1000.0;
for (i = 0; i < mp3->synth.pcm.length; i++) {
signed int sample;
sample = (signed int)audio_linear_dither (16, mp3->synth.pcm.samples[0][i], &dither);
*(out_ptr++) = sample & 0xff;
*(out_ptr++) = sample >> 8;
if (MAD_NCHANNELS (&(mp3->frame).header) == 2) {
sample = (signed int) audio_linear_dither (16, mp3->synth.pcm.samples[1][i], &dither);
*(out_ptr++) = sample & 0xff;
*(out_ptr++) = sample >> 8;
}
if (out_ptr == out_buf_end) {
memcpy (buffer, buffer2, BUF_SIZE);
bossao_play_chunk (song, buffer, BUF_SIZE);
out_ptr = buffer2;
}
}
开发者ID:tedkulp,项目名称:bossogg,代码行数:34,代码来源:mp3.c
示例5: memalign
void Mp3Decoder::OpenFile()
{
GuardPtr = NULL;
ReadBuffer = (u8 *) memalign(32, SoundBlockSize*SoundBlocks);
if(!ReadBuffer)
{
if(file_fd)
delete file_fd;
file_fd = NULL;
return;
}
u8 dummybuff[4096];
int ret = Read(dummybuff, 4096, 0);
if(ret <= 0)
{
if(file_fd)
delete file_fd;
file_fd = NULL;
return;
}
SampleRate = (u32) Frame.header.samplerate;
Format = ((MAD_NCHANNELS(&Frame.header) == 2) ? VOICE_STEREO_16BIT : VOICE_MONO_16BIT);
Rewind();
Decode();
}
开发者ID:SuperrSonic,项目名称:WiiXplorer-SS,代码行数:27,代码来源:Mp3Decoder.cpp
示例6: output_synth_data
int output_synth_data(mpgedit_madbuf_t *ctx)
{
int i;
int rsts;
for(i=0;i<ctx->Synth.pcm.length;i++) {
signed short Sample;
/* Left channel */
Sample=MadFixedToSshort(ctx->Synth.pcm.samples[0][i]);
*(ctx->OutputPtr++) = Sample & 0xff;
*(ctx->OutputPtr++) = Sample >> 8;
/* Right channel. If the decoded stream is monophonic then
* the right output channel is the same as the left one.
*/
if(MAD_NCHANNELS(&ctx->Frame.header)==2) {
Sample=MadFixedToSshort(ctx->Synth.pcm.samples[1][i]);
*(ctx->OutputPtr++) = Sample & 0xff;
*(ctx->OutputPtr++) = Sample >> 8;
}
/* Flush the output buffer if it is full. */
if (ctx->OutputPtr >= ctx->OutputBufferEnd) {
rsts = fwrite(ctx->OutputBuffer, 1, OUTPUT_BUFFER_SIZE, ctx->outfp);
if (rsts != OUTPUT_BUFFER_SIZE) {
fprintf(stderr,"%s: PCM write error (%s).\n",
"main" ,strerror(errno));
return 1;
}
ctx->OutputPtr = ctx->OutputBuffer;
}
}
开发者ID:gusrc,项目名称:mpgedit,代码行数:33,代码来源:readframes1.c
示例7: mad_synth_frame
/*
* NAME: synth->frame()
* DESCRIPTION: perform PCM synthesis of frame subband samples
*/
void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame) {
unsigned int nch, ns;
void (*synth_frame)(struct mad_synth *, struct mad_frame const *,
unsigned int, unsigned int);
nch = MAD_NCHANNELS(&frame->header);
ns = MAD_NSBSAMPLES(&frame->header);
synth->pcm.samplerate = frame->header.samplerate;
synth->pcm.channels = nch;
synth->pcm.length = 32 * ns;
synth_frame = synth_full;
if (frame->options & MAD_OPTION_HALFSAMPLERATE) {
synth->pcm.samplerate /= 2;
synth->pcm.length /= 2;
synth_frame = synth_half;
}
synth_frame(synth, frame, nch, ns);
synth->phase = (synth->phase + ns) % 16;
}
开发者ID:dnwang,项目名称:android_demo,代码行数:29,代码来源:synth.c
示例8: mad_header_cb
static enum mad_flow mad_header_cb(void *blob, const mad_header_t *header) {
state_t *data = (state_t *)blob;
data->sample_rate = header->samplerate;
data->output_channels = MAD_NCHANNELS(header);
data->output_size += mad_timer_count(header->duration, header->samplerate);
return MAD_FLOW_IGNORE;
}
开发者ID:tlevine,项目名称:tuneR,代码行数:8,代码来源:readmp3.c
示例9: while
int MP3Stream::readBuffer(int16 *buffer, const int numSamples) {
int samples = 0;
// Keep going as long as we have input available
while (samples < numSamples && _state != MP3_STATE_EOS) {
const int len = MIN(numSamples, samples + (int)(_synth.pcm.length - _posInFrame) * MAD_NCHANNELS(&_frame.header));
while (samples < len) {
*buffer++ = (int16)scale_sample(_synth.pcm.samples[0][_posInFrame]);
samples++;
if (MAD_NCHANNELS(&_frame.header) == 2) {
*buffer++ = (int16)scale_sample(_synth.pcm.samples[1][_posInFrame]);
samples++;
}
_posInFrame++;
}
if (_posInFrame >= _synth.pcm.length) {
// We used up all PCM data in the current frame -- read & decode more
decodeMP3Data();
}
}
return samples;
}
开发者ID:Templier,项目名称:residual,代码行数:21,代码来源:mp3.cpp
示例10: put_output
static int put_output (char *buf, int buf_len, struct mad_pcm *pcm,
struct mad_header *header)
{
unsigned int nsamples;
mad_fixed_t const *left_ch, *right_ch;
int olen;
nsamples = pcm->length;
left_ch = pcm->samples[0];
right_ch = pcm->samples[1];
olen = nsamples * MAD_NCHANNELS (header) * 4;
if (olen > buf_len) {
logit ("PCM buffer to small!");
return 0;
}
while (nsamples--) {
long sample0 = round_sample (*left_ch++);
buf[0] = 0;
buf[1] = sample0;
buf[2] = sample0 >> 8;
buf[3] = sample0 >> 16;
buf += 4;
if (MAD_NCHANNELS(header) == 2) {
long sample1;
sample1 = round_sample (*right_ch++);
buf[0] = 0;
buf[1] = sample1;
buf[2] = sample1 >> 8;
buf[3] = sample1 >> 16;
buf += 4;
}
}
开发者ID:ecthiender,项目名称:mocp-git,代码行数:39,代码来源:mp3.c
示例11: DEBUG_ENTER_FUNC
int Mp3PspStream::readBuffer(int16 *buffer, const int numSamples) {
DEBUG_ENTER_FUNC();
int samples = 0;
#ifdef PRINT_BUFFERS
int16 *debugBuffer = buffer;
#endif
// Keep going as long as we have input available
while (samples < numSamples && _state != MP3_STATE_EOS) {
const int len = MIN(numSamples, samples + (int)(_pcmLength - _posInFrame) * MAD_NCHANNELS(&_header));
while (samples < len) {
*buffer++ = _pcmSamples[_posInFrame << 1];
samples++;
if (MAD_NCHANNELS(&_header) == 2) {
*buffer++ = _pcmSamples[(_posInFrame << 1) + 1];
samples++;
}
_posInFrame++; // always skip an extra sample since ME always outputs stereo
}
if (_posInFrame >= _pcmLength) {
// We used up all PCM data in the current frame -- read & decode more
decodeMP3Data();
}
}
#ifdef PRINT_BUFFERS
PSP_INFO_PRINT("buffer:\n");
for (int i = 0; i<numSamples; i++)
PSP_INFO_PRINT("%d ", debugBuffer[i]);
PSP_INFO_PRINT("\n\n");
#endif
return samples;
}
开发者ID:MatChung,项目名称:scummvm-ps3,代码行数:37,代码来源:mp3.cpp
示例12: ASSERT
RageSoundReader_FileReader::OpenResult RageSoundReader_MP3::Open( RageFileBasic *pFile )
{
m_pFile = pFile;
mad->filesize = m_pFile->GetFileSize();
ASSERT( mad->filesize != -1 );
/* Make sure we can decode at least one frame. This will also fill in header info. */
mad->outpos = 0;
int ret = do_mad_frame_decode();
switch(ret)
{
case 0:
SetError( "Failed to read any data at all" );
return OPEN_UNKNOWN_FILE_FORMAT;
case -1:
SetError( GetError() + " (not an MP3 stream?)" );
return OPEN_UNKNOWN_FILE_FORMAT;
}
/* Store the bitrate of the frame we just got. */
if( mad->bitrate == -1 ) /* might have been set by a Xing tag */
mad->bitrate = mad->Frame.header.bitrate;
SampleRate = mad->Frame.header.samplerate;
mad->framelength = mad->Frame.header.duration;
this->Channels = MAD_NCHANNELS( &mad->Frame.header );
/* Since we've already decoded a frame, just synth it instead of rewinding
* the stream. */
synth_output();
if(mad->length == -1)
{
/* If vbr and !xing, this is just an estimate. */
int bps = mad->bitrate / 8;
float secs = (float)(mad->filesize - mad->header_bytes) / bps;
mad->length = (int)(secs * 1000.f);
}
return OPEN_OK;
}
开发者ID:SamDecrock,项目名称:stepmania5-http-post-scores,代码行数:43,代码来源:RageSoundReader_MP3.cpp
示例13: mad_synth_frame
//extern unsigned char set__;
void mad_synth_frame(struct mad_synth *synth, struct mad_frame /*const*/ *frame)
{
unsigned int nch, ns;
static int samplerate=0;
void (*synth_frame)(struct mad_synth *, struct mad_frame /*const*/ *,
unsigned int, unsigned int);
nch = MAD_NCHANNELS(&frame->header);
ns = MAD_NSBSAMPLES(&frame->header);
synth->pcm.samplerate = frame->header.samplerate;
//--set_dac_sample_rate(synth->pcm.samplerate);
//while(g_ulFlags!=7);
//if(set__)
{
vPortEnterCritical( );
SoundSetFormat(frame->header.samplerate,16,1);
//set__=0;
vPortExitCritical( );
}
synth->pcm.channels = nch;
synth->pcm.length = 32 * ns;
samplerate = synth->pcm.samplerate;
synth_frame = synth_full;
if (frame->options & MAD_OPTION_HALFSAMPLERATE) {
synth->pcm.samplerate /= 2;
synth->pcm.length /= 2;
//--set_dac_sample_rate(synth->pcm.samplerate);
vPortEnterCritical( );
SoundSetFormat(frame->header.samplerate,16,1);
vPortExitCritical( );
synth_frame = synth_half;
}
synth_frame(synth, frame, nch, ns);
synth->phase = (synth->phase + ns) % 16;
}
开发者ID:KYHuang,项目名称:arm-mp3-player,代码行数:43,代码来源:synth.c
示例14: Open
bool MADDecoder::Open(FileSpecifier &File)
{
if (!File.Open(file)) return false;
file_done = false;
if (DecodeFrame())
{
stereo = (MAD_NCHANNELS(&Frame.header) == 2);
bytes_per_frame = 2 * (stereo ? 2 : 1);
rate = Frame.header.samplerate;
sample = 0;
return true;
}
else
{
return false;
}
}
开发者ID:Aleph-One-Marathon,项目名称:alephone-dingoo,代码行数:20,代码来源:MADDecoder.cpp
示例15: mp3_decode
static void
mp3_decode(struct decoder *decoder, struct input_stream *input_stream)
{
struct mp3_data data;
GError *error = NULL;
struct tag *tag = NULL;
struct audio_format audio_format;
if (!mp3_open(input_stream, &data, decoder, &tag)) {
if (decoder_get_command(decoder) == DECODE_COMMAND_NONE)
g_warning
("Input does not appear to be a mp3 bit stream.\n");
return;
}
if (!audio_format_init_checked(&audio_format,
data.frame.header.samplerate,
SAMPLE_FORMAT_S24_P32,
MAD_NCHANNELS(&data.frame.header),
&error)) {
g_warning("%s", error->message);
g_error_free(error);
if (tag != NULL)
tag_free(tag);
mp3_data_finish(&data);
return;
}
decoder_initialized(decoder, &audio_format,
data.input_stream->seekable, data.total_time);
if (tag != NULL) {
decoder_tag(decoder, input_stream, tag);
tag_free(tag);
}
while (mp3_read(&data)) ;
mp3_data_finish(&data);
}
开发者ID:Acidburn0zzz,项目名称:mpd,代码行数:41,代码来源:mad_decoder_plugin.c
示例16: scale
void RageSoundReader_MP3::synth_output()
{
mad->outleft = mad->outpos = 0;
if( MAD_NCHANNELS(&mad->Frame.header) != this->Channels )
{
/* This frame contains a different number of channels than the first.
* I've never actually seen this--it's just to prevent exploding if
* it happens--and we could continue on easily enough, so if it happens,
* just continue. */
return;
}
mad_synth_frame(&mad->Synth, &mad->Frame);
for(int i=0; i < mad->Synth.pcm.length; i++)
{
for(int chan = 0; chan < this->Channels; ++chan)
{
float Sample = scale(mad->Synth.pcm.samples[chan][i]);
mad->outbuf[mad->outleft] = Sample;
++mad->outleft;
}
}
}
开发者ID:SamDecrock,项目名称:stepmania5-http-post-scores,代码行数:24,代码来源:RageSoundReader_MP3.cpp
示例17: fopen
void LibMadWrapper::open()
{
// avoid multiple calls to open()
if (this->infile != nullptr)
{
return;
}
this->infile = fopen(this->Filename.c_str(), "rb");
if (this->infile == nullptr)
{
THROW_RUNTIME_ERROR("fopen failed, errno: " << string(strerror(errno)));
}
int fd = fileno(this->infile);
this->mpeglen = getFileSize(fd);
this->mpegbuf = static_cast<unsigned char *>(mmap(nullptr, this->mpeglen, PROT_READ, MAP_SHARED, fd, 0));
if (this->mpegbuf == MAP_FAILED)
{
THROW_RUNTIME_ERROR("mmap failed for File \"" << this->Filename << ")\"");
}
this->stream = new struct mad_stream;
mad_stream_init(this->stream);
/* load buffer with MPEG audio data */
mad_stream_buffer(this->stream, this->mpegbuf, this->mpeglen);
// we want to know how many pcm frames there are decoded in this file
// therefore decode header of every mpeg frame
// pretty expensive, so only to this once
if (this->numFrames == 0)
{
struct mad_header header;
mad_header_init(&header);
// try to find a valid header
int ret = this->findValidHeader(header);
if (ret != 0)
{
// only free the locally used header here, this->stream and this->mpegbuf are freed in LibMadWrapper::close()
mad_header_finish(&header);
THROW_RUNTIME_ERROR("unable to find a valid frame-header for File \"" + this->Filename + "\"");
}
this->Format.SetVoices(1);
// a first valid header is good, but it may contain garbage
this->Format.VoiceChannels[0] = MAD_NCHANNELS(&header);
this->Format.SampleRate = header.samplerate;
CLOG(LogLevel_t::Debug, "found a first valid header within File \"" << this->Filename << "\"\n\tchannels: " << MAD_NCHANNELS(&header) << "\nsrate: " << header.samplerate);
// no clue what this 32 does
// stolen from mad_synth_frame() in synth.c
this->numFrames += 32 * MAD_NSBSAMPLES(&header);
// try to find a second valid header
ret = this->findValidHeader(header);
if (ret == 0)
{
// better use format infos from this header
this->Format.VoiceChannels[0] = max<int>(MAD_NCHANNELS(&header), this->Format.VoiceChannels[0]);
this->Format.SampleRate = header.samplerate;
CLOG(LogLevel_t::Debug, "found a second valid header within File \"" << this->Filename << "\"\n\tchannels: " << MAD_NCHANNELS(&header) << "\nsrate: " << header.samplerate);
this->numFrames += 32 * MAD_NSBSAMPLES(&header);
// now lets go on and decode rest of file
while (1)
{
if (mad_header_decode(&header, this->stream) != 0)
{
if (MAD_RECOVERABLE(this->stream->error))
{
continue;
}
else
{
break;
}
}
// sanity checks
if (this->Format.Channels() != MAD_NCHANNELS(&header))
{
CLOG(LogLevel_t::Warning, "channelcount varies (now: " << MAD_NCHANNELS(&header) << ") within File \"" << this->Filename << ")\"");
if (!gConfig.MadPermissive)
{
THROW_RUNTIME_ERROR("invalid mp3: channelcount varies");
}
}
if (this->Format.SampleRate != header.samplerate)
{
CLOG(LogLevel_t::Warning, "samplerate varies (now: " << header.samplerate << ") within File \"" << this->Filename << ")\"");
if (!gConfig.MadPermissive)
{
THROW_RUNTIME_ERROR("invalid mp3: samplerate varies");
//.........这里部分代码省略.........
开发者ID:derselbst,项目名称:ANMP,代码行数:101,代码来源:LibMadWrapper.cpp
示例18: output
enum mad_flow output(void *data,
struct mad_header const *header,
struct mad_pcm *pcm)
{
register int nsamples = pcm->length;
mad_fixed_t const *left_ch = pcm->samples[0], *right_ch = pcm->samples[1];
static unsigned char stream[1152*4]; /* 1152 because that's what mad has as a max; *4 because
there are 4 distinct bytes per sample (in 2 channel case) */
static unsigned int rate = 0;
static int channels = 0;
static struct audio_dither dither;
register char * ptr = stream;
register signed int sample;
register mad_fixed_t tempsample;
/* Semaphore operations */
static struct sembuf read_sops = {0, -1, 0};
static struct sembuf write_sops = {1, 1, 0};
if(options.opt & MPG321_ENABLE_BUFFER)
{
semop(semarray,&read_sops,1);
ptr = (Output_Queue+mad_decoder_position)->data;
memcpy(&((Output_Queue+mad_decoder_position)->header),header,sizeof(struct mad_header));
}else{
/* We need to know information about the file before we can open the playdevice
in some cases. So, we do it here. */
if (!playdevice)
{
channels = MAD_NCHANNELS(header);
rate = header->samplerate;
open_ao_playdevice(header);
}
else if ((channels != MAD_NCHANNELS(header) || rate != header->samplerate) && playdevice_is_live())
{
ao_close(playdevice);
channels = MAD_NCHANNELS(header);
rate = header->samplerate;
open_ao_playdevice(header);
}
}
static int peak_rate = 0;
static unsigned short int peak = 0;
if (pcm->channels == 2)
{
while (nsamples--)
{
tempsample = mad_f_mul(*left_ch++, options.volume);
sample = (signed int) audio_linear_dither(16, tempsample, &dither);
peak = abs(sample) > peak ? abs(sample) : peak;
#ifndef WORDS_BIGENDIAN
*ptr++ = (unsigned char) (sample >> 0);
*ptr++ = (unsigned char) (sample >> 8);
#else
*ptr++ = (unsigned char) (sample >> 8);
*ptr++ = (unsigned char) (sample >> 0);
#endif
tempsample = mad_f_mul(*right_ch++, options.volume);
sample = (signed int) audio_linear_dither(16, tempsample, &dither);
peak = abs(sample) > peak ? abs(sample) : peak;
#ifndef WORDS_BIGENDIAN
*ptr++ = (unsigned char) (sample >> 0);
*ptr++ = (unsigned char) (sample >> 8);
#else
*ptr++ = (unsigned char) (sample >> 8);
*ptr++ = (unsigned char) (sample >> 0);
#endif
}
process_fft(stream, pcm->length * 4);
if(options.opt & MPG321_ENABLE_BUFFER)
{
(Output_Queue+mad_decoder_position)->length = pcm->length * 4;
}else
{
ao_play(playdevice, stream, pcm->length * 4);
}
}
else if (options.opt & MPG321_FORCE_STEREO)
开发者ID:mvd7793,项目名称:RED-SIREN,代码行数:92,代码来源:mad.c
示例19: read_header
enum mad_flow read_header(void *data, struct mad_header const * header)
{
char long_currenttime_str[14]; /* this *will* fill if you're using 100000+ minute mp3s */
char long_remaintime_str[14];
static int frames_played = 0;
buffer *playbuf = (buffer *)data;
mad_timer_t time_remaining;
char *ao_time;
if (stop_playing_file)
{
stop_playing_file = 0;
status = MPG321_STOPPED;
return MAD_FLOW_STOP;
}
if(options.opt & MPG321_REMOTE_PLAY)
{
enum mad_flow mf;
/* We might have to stop if the user inputs something */
if ((mf = remote_get_input_nowait(playbuf)))
return mf;
}
/* Stop playing if -n is used, and we're at the frame specified. */
if ((playbuf->max_frames != -1) && (frames_played++ > playbuf->max_frames))
{
frames_played = 0;
status = MPG321_STOPPED;
if(options.opt & MPG321_ENABLE_BUFFER) Decoded_Frames->done = 1;
//fprintf(stderr,"Total D: %d\n",Decoded_Frames->total_decoded_frames);
return MAD_FLOW_STOP;
}
current_frame++;
mad_timer_add(¤t_time, header->duration);
if(options.opt & MPG321_USE_SCROBBLER && scrobbler_time > 0 && scrobbler_time < current_time.seconds)
{
scrobbler_time = -1;
scrobbler_report();
}
if(options.opt & (MPG321_VERBOSE_PLAY | MPG321_REMOTE_PLAY))
{
mad_timer_string(current_time, long_currenttime_str, "%.2u:%.2u.%.2u", MAD_UNITS_MINUTES,
MAD_UNITS_CENTISECONDS, 0);
if (mad_timer_compare(playbuf->duration, mad_timer_zero) == 0)
time_remaining = current_time;
else
time_remaining = playbuf->duration;
mad_timer_negate(¤t_time);
mad_timer_add(&time_remaining, current_time);
mad_timer_negate(¤t_time);
mad_timer_string(time_remaining, long_remaintime_str, "%.2u:%.2u.%.2u", MAD_UNITS_MINUTES,
MAD_UNITS_CENTISECONDS, 0);
}
/* update cached table of frames & times */
if (current_frame <= playbuf->num_frames) /* we only allocate enough for our estimate. */
{
playbuf->frames[current_frame] = playbuf->frames[current_frame-1] + (header->bitrate / 8 / 1000)
* mad_timer_count(header->duration, MAD_UNITS_MILLISECONDS);
playbuf->times[current_frame] = current_time;
}
if (file_change)
{
file_change = 0;
if (options.opt & MPG321_REMOTE_PLAY)
{
printf("@S %s %d %d %s %d %ld %d %d %d %d %ld %d\n",versionstring(header->flags), header->layer, header->samplerate,
modestringucase(header->mode), header->mode_extension,
(header->bitrate / 8 / 100) * mad_timer_count(header->duration, MAD_UNITS_CENTISECONDS),
MAD_NCHANNELS(header), header->flags & MAD_FLAG_COPYRIGHT ? 1 : 0,
header->flags & MAD_FLAG_PROTECTION ? 1 : 0, header->emphasis,
header->bitrate/1000, header->mode_extension);
}
else if (options.opt & MPG321_VERBOSE_PLAY)/*zip it good*/
{
fprintf(stderr, "MPEG %s, Layer: %s, Freq: %d, mode: %s, modext: %d, BPF : %ld\n"
"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n"
"Bitrate: %ld Kbits/s, Extension value: %d\n"
"Audio: 1:1 conversion, rate: %d, encoding: signed 16 bit, channels: %d\n",
versionstring(header->flags),layerstring(header->layer), header->samplerate, modestringucase(header->mode), header->mode_extension,
(header->bitrate / 100) * mad_timer_count(header->duration, MAD_UNITS_CENTISECONDS),
MAD_NCHANNELS(header), header->flags & MAD_FLAG_COPYRIGHT ? "Yes" : "No",
header->flags & MAD_FLAG_ORIGINAL ? "Yes" : "No", header->flags & MAD_FLAG_PROTECTION ? "Yes" : "No",
header->emphasis, header->bitrate/1000, header->mode_extension,
header->samplerate, MAD_NCHANNELS(header));
}
//.........这里部分代码省略.........
开发者ID:mvd7793,项目名称:RED-SIREN,代码行数:101,代码来源:mad.c
示例20: mad_layer_II
/*
* NAME: layer->II()
* DESCRIPTION: decode a single Layer II frame
*/
int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame)
{
struct mad_header *header = &frame->header;
struct mad_bitptr start;
unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb;
unsigned char const *offsets;
unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3];
mad_fixed_t samples[3];
nch = MAD_NCHANNELS(header);
if (header->flags & MAD_FLAG_LSF_EXT)
index = 4;
else {
switch (nch == 2 ? header->bitrate / 2 : header->bitrate) {
case 32000:
case 48000:
index = (header->samplerate == 32000) ? 3 : 2;
break;
case 56000:
case 64000:
case 80000:
index = 0;
break;
default:
index = (header->samplerate == 48000) ? 0 : 1;
}
}
sblimit = sbquant_table[index].sblimit;
offsets = sbquant_table[index].offsets;
bound = 32;
if (header->mode == MAD_MODE_JOINT_STEREO) {
header->flags |= MAD_FLAG_I_STEREO;
bound = 4 + header->mode_extension * 4;
}
if (bound > sblimit)
bound = sblimit;
start = stream->ptr;
/* decode bit allocations */
for (sb = 0; sb < bound; ++sb) {
nbal = bitalloc_table[offsets[sb]].nbal;
for (ch = 0; ch < nch; ++ch)
allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal);
}
for (sb = bound; sb < sblimit; ++sb) {
nbal = bitalloc_table[offsets[sb]].nbal;
allocation[0][sb] =
allocation[1][sb] = mad_bit_read(&stream->ptr, nbal);
}
/* decode scalefactor selection info */
for (sb = 0; sb < sblimit; ++sb) {
for (ch = 0; ch < nch; ++ch) {
if (allocation[ch][sb])
scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2);
}
}
/* check CRC word */
if (header->flags & MAD_FLAG_PROTECTION) {
header->crc_check =
mad_bit_crc(start, mad_bit_length(&start, &stream->ptr),
header->crc_check);
if (header->crc_check != header->crc_target &&
!(frame->options & MAD_OPTION_IGNORECRC)) {
stream->error = MAD_ERROR_BADCRC;
return -1;
}
}
/* decode scalefactors */
for (sb = 0; sb < sblimit; ++sb) {
for (ch = 0; ch < nch; ++ch) {
if (allocation[ch][sb]) {
scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6);
switch (scfsi[ch][sb]) {
case 2:
scalefactor[ch][sb][2] =
scalefactor[ch][sb][1] =
scalefactor[ch][sb][0];
//.........这里部分代码省略.........
开发者ID:Eaeth,项目名称:myNCCL,代码行数:101,代码来源:layer12.c
注:本文中的MAD_NCHANNELS函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论