static gboolean
gst_musepack_stream_init (GstMusepackDec * musepackdec)
{
  mpc_streaminfo i;
  GstTagList *tags;
  GstCaps *caps;
  gchar *stream_id;

  /* set up reading */
  gst_musepack_init_reader (musepackdec->r, musepackdec);

  musepackdec->d = mpc_demux_init (musepackdec->r);
  if (!musepackdec->d) {
    GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
    return FALSE;
  }

  mpc_demux_get_info (musepackdec->d, &i);

  stream_id = gst_pad_create_stream_id (musepackdec->srcpad,
      GST_ELEMENT_CAST (musepackdec), NULL);
  gst_pad_push_event (musepackdec->srcpad,
      gst_event_new_stream_start (stream_id));
  g_free (stream_id);

  /* capsnego */
  caps = gst_caps_new_simple ("audio/x-raw",
      "format", G_TYPE_STRING, GST_MPC_FORMAT,
      "layout", G_TYPE_STRING, "interleaved",
      "channels", G_TYPE_INT, i.channels,
      "rate", G_TYPE_INT, i.sample_freq, NULL);
  gst_pad_use_fixed_caps (musepackdec->srcpad);
  if (!gst_pad_set_caps (musepackdec->srcpad, caps)) {
    GST_ELEMENT_ERROR (musepackdec, CORE, NEGOTIATION, (NULL), (NULL));
    return FALSE;
  }

  g_atomic_int_set (&musepackdec->bps, 4 * i.channels);
  g_atomic_int_set (&musepackdec->rate, i.sample_freq);

  musepackdec->segment.position = 0;
  musepackdec->segment.duration = mpc_streaminfo_get_length_samples (&i);

  /* send basic tags */
  tags = gst_tag_list_new_empty ();
  gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
      GST_TAG_AUDIO_CODEC, "Musepack", NULL);

  if (i.encoder[0] != '\0' && i.encoder_version > 0) {
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
        GST_TAG_ENCODER, i.encoder,
        GST_TAG_ENCODER_VERSION, i.encoder_version, NULL);
  }

  if (i.bitrate > 0) {
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
        GST_TAG_BITRATE, i.bitrate, NULL);
  } else if (i.average_bitrate > 0.0) {
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
        GST_TAG_BITRATE, (guint) i.average_bitrate, NULL);
  }

  if (i.gain_title != 0 || i.gain_album != 0) {
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
        GST_TAG_TRACK_GAIN, (gdouble) i.gain_title / 100.0,
        GST_TAG_ALBUM_GAIN, (gdouble) i.gain_album / 100.0, NULL);
  }

  if (i.peak_title != 0 && i.peak_title != 32767 &&
      i.peak_album != 0 && i.peak_album != 32767) {
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
        GST_TAG_TRACK_PEAK, (gdouble) i.peak_title / 32767.0,
        GST_TAG_ALBUM_PEAK, (gdouble) i.peak_album / 32767.0, NULL);
  }

  GST_LOG_OBJECT (musepackdec, "Posting tags: %" GST_PTR_FORMAT, tags);
  gst_pad_push_event (musepackdec->srcpad, gst_event_new_tag (tags));


  return TRUE;
}
Esempio n. 2
0
bool SFB::Audio::MusepackDecoder::_Open(CFErrorRef *error)
{
	UInt8 buf [PATH_MAX];
	if(!CFURLGetFileSystemRepresentation(mInputSource->GetURL(), FALSE, buf, PATH_MAX))
		return false;

	mReader.read = read_callback;
	mReader.seek = seek_callback;
	mReader.tell = tell_callback;
	mReader.get_size = get_size_callback;
	mReader.canseek = canseek_callback;
	mReader.data = this;
	
	mDemux = mpc_demux_init(&mReader);
	if(nullptr == mDemux) {
		if(error) {
			SFB::CFString description = CFCopyLocalizedString(CFSTR("The file “%@” is not a valid Musepack file."), "");
			SFB::CFString failureReason = CFCopyLocalizedString(CFSTR("Not a Musepack file"), "");
			SFB::CFString recoverySuggestion = CFCopyLocalizedString(CFSTR("The file's extension may not match the file's type."), "");
			
			*error = CreateErrorForURL(Decoder::ErrorDomain, Decoder::InputOutputError, description, mInputSource->GetURL(), failureReason, recoverySuggestion);
		}

		mpc_reader_exit_stdio(&mReader);
		
		return false;
	}
	
	// Get input file information
	mpc_streaminfo streaminfo;
	mpc_demux_get_info(mDemux, &streaminfo);
	
	mTotalFrames				= mpc_streaminfo_get_length_samples(&streaminfo);
	
	// Canonical Core Audio format
	mFormat.mFormatID			= kAudioFormatLinearPCM;
	mFormat.mFormatFlags		= kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
	
	mFormat.mSampleRate			= streaminfo.sample_freq;
	mFormat.mChannelsPerFrame	= streaminfo.channels;
	mFormat.mBitsPerChannel		= 8 * sizeof(float);
	
	mFormat.mBytesPerPacket		= (mFormat.mBitsPerChannel / 8);
	mFormat.mFramesPerPacket	= 1;
	mFormat.mBytesPerFrame		= mFormat.mBytesPerPacket * mFormat.mFramesPerPacket;
	
	mFormat.mReserved			= 0;
	
	// Set up the source format
	mSourceFormat.mFormatID				= 'MUSE';
	
	mSourceFormat.mSampleRate			= streaminfo.sample_freq;
	mSourceFormat.mChannelsPerFrame		= streaminfo.channels;
	
	mSourceFormat.mFramesPerPacket		= (1 << streaminfo.block_pwr);
	
	// Setup the channel layout
	switch(streaminfo.channels) {
		case 1:		mChannelLayout = ChannelLayout::ChannelLayoutWithTag(kAudioChannelLayoutTag_Mono);			break;
		case 2:		mChannelLayout = ChannelLayout::ChannelLayoutWithTag(kAudioChannelLayoutTag_Stereo);		break;
		case 4:		mChannelLayout = ChannelLayout::ChannelLayoutWithTag(kAudioChannelLayoutTag_Quadraphonic);	break;
	}
	
	// Allocate the buffer list
	if(!mBufferList.Allocate(mFormat, MPC_FRAME_LENGTH)) {
		if(error)
			*error = CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainPOSIX, ENOMEM, nullptr);

		mpc_demux_exit(mDemux), mDemux = nullptr;
		mpc_reader_exit_stdio(&mReader);
		
		return false;
	}

	for(UInt32 i = 0; i < mBufferList->mNumberBuffers; ++i)
		mBufferList->mBuffers[i].mDataByteSize = 0;

	return true;
}
Esempio n. 3
0
uint64 CDAFReader_MPC::FrameCount(void)
{
    return(mpc_streaminfo_get_length_samples(&si));
}
Esempio n. 4
0
static gboolean
gst_musepack_stream_init (GstMusepackDec * musepackdec)
{
    mpc_streaminfo i;
    GstTagList *tags;
    GstCaps *caps;

    /* set up reading */
    gst_musepack_init_reader (musepackdec->r, musepackdec);

#ifdef MPC_IS_OLD_API
    /* streaminfo */
    mpc_streaminfo_init (&i);
    if (mpc_streaminfo_read (&i, musepackdec->r) < 0) {
        GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
        return FALSE;
    }

    /* decoding */
    mpc_decoder_setup (musepackdec->d, musepackdec->r);
    mpc_decoder_scale_output (musepackdec->d, 1.0);
    if (!mpc_decoder_initialize (musepackdec->d, &i)) {
        GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
        return FALSE;
    }
#else
    musepackdec->d = mpc_demux_init (musepackdec->r);
    if (!musepackdec->d) {
        GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
        return FALSE;
    }

    mpc_demux_get_info (musepackdec->d, &i);
#endif

    /* capsnego */
    caps = gst_caps_from_string (BASE_CAPS);
    gst_caps_set_simple (caps,
                         "endianness", G_TYPE_INT, G_BYTE_ORDER,
                         "channels", G_TYPE_INT, i.channels,
                         "rate", G_TYPE_INT, i.sample_freq, NULL);
    gst_pad_use_fixed_caps (musepackdec->srcpad);
    if (!gst_pad_set_caps (musepackdec->srcpad, caps)) {
        GST_ELEMENT_ERROR (musepackdec, CORE, NEGOTIATION, (NULL), (NULL));
        return FALSE;
    }

    g_atomic_int_set (&musepackdec->bps, 4 * i.channels);
    g_atomic_int_set (&musepackdec->rate, i.sample_freq);

    gst_segment_set_last_stop (&musepackdec->segment, GST_FORMAT_DEFAULT, 0);
    gst_segment_set_duration (&musepackdec->segment, GST_FORMAT_DEFAULT,
                              mpc_streaminfo_get_length_samples (&i));

    /* send basic tags */
    tags = gst_tag_list_new ();
    gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                      GST_TAG_AUDIO_CODEC, "Musepack", NULL);

    if (i.encoder[0] != '\0' && i.encoder_version > 0) {
        gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                          GST_TAG_ENCODER, i.encoder,
                          GST_TAG_ENCODER_VERSION, i.encoder_version, NULL);
    }

    if (i.bitrate > 0) {
        gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                          GST_TAG_BITRATE, i.bitrate, NULL);
    } else if (i.average_bitrate > 0.0) {
        gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                          GST_TAG_BITRATE, (guint) i.average_bitrate, NULL);
    }

    if (i.gain_title != 0 || i.gain_album != 0) {
        gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                          GST_TAG_TRACK_GAIN, (gdouble) i.gain_title / 100.0,
                          GST_TAG_ALBUM_GAIN, (gdouble) i.gain_album / 100.0, NULL);
    }

    if (i.peak_title != 0 && i.peak_title != 32767 &&
            i.peak_album != 0 && i.peak_album != 32767) {
        gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
                          GST_TAG_TRACK_PEAK, (gdouble) i.peak_title / 32767.0,
                          GST_TAG_ALBUM_PEAK, (gdouble) i.peak_album / 32767.0, NULL);
    }

    GST_LOG_OBJECT (musepackdec, "Posting tags: %" GST_PTR_FORMAT, tags);
    gst_element_found_tags (GST_ELEMENT (musepackdec), tags);

    return TRUE;
}
Esempio n. 5
0
 int64 FrameCount(void)
 {
  return(mpc_streaminfo_get_length_samples(&si));
 }