コード例 #1
0
void UOpenALAudioSubsystem::RegisterMusic( UMusic* Music )
{
	guard(UOpenALAudioSubsystem::RegisterMusic);

	checkSlow(Music);
	if( !Music->Handle )
	{
		// Set the handle to avoid reentrance.
		Music->Handle = (void*)-1;

		// Load the data.
		Music->Data.Load();
		debugf( NAME_DevMusic, TEXT("Register music: %s (%i)"), Music->GetPathName(), Music->Data.Num() );
		check(Music->Data.Num()>0);

		// Load the module.
		MREADER* Reader = BuildMikModMemoryReader( &Music->Data(0), Music->Data.Num() );
		MODULE* Module = Player_LoadGeneric( Reader, 64, 0 );
		DestroyMikModMemoryReader( Reader );
		if( Module == NULL )
			appErrorf(
				TEXT("Couldn't load music '%s': %s"),
				Music->GetPathName(), MikMod_strerror( MikMod_errno )
			);
		Music->Handle = Module;

		// Enable looping and wrapping.
		Module->loop = Module->wrap = 1;

		// Unload the data.
		Music->Data.Unload();
	}

	unguard;
}
コード例 #2
0
ファイル: gstmikmod.c プロジェクト: an146/gst-plugins-good
static void
gst_mikmod_loop (GstElement * element)
{
  GstMikMod *mikmod;
  GstBuffer *buffer_in;

  g_return_if_fail (element != NULL);
  g_return_if_fail (GST_IS_MIKMOD (element));

  mikmod = GST_MIKMOD (element);
  srcpad = mikmod->srcpad;
  mikmod->Buffer = NULL;

  if (!mikmod->initialized) {
    while ((buffer_in = GST_BUFFER (gst_pad_pull (mikmod->sinkpad)))) {
      if (GST_IS_EVENT (buffer_in)) {
        GstEvent *event = GST_EVENT (buffer_in);

        if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
          break;
      } else {
        if (mikmod->Buffer) {
          mikmod->Buffer = gst_buffer_append (mikmod->Buffer, buffer_in);
        } else {
          mikmod->Buffer = buffer_in;
        }
      }
    }

    if (!GST_PAD_CAPS (mikmod->srcpad)) {
      if (GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (mikmod->srcpad))) {
        GST_ELEMENT_ERROR (mikmod, CORE, NEGOTIATION, (NULL), (NULL));
        return;
      }
    }

    MikMod_RegisterDriver (&drv_gst);
    MikMod_RegisterAllLoaders ();

    MikMod_Init ("");
    reader = GST_READER_new (mikmod);
    module = Player_LoadGeneric (reader, 64, 0);

    gst_buffer_unref (mikmod->Buffer);

    if (!Player_Active ())
      Player_Start (module);

    mikmod->initialized = TRUE;
  }

  if (Player_Active ()) {
    timestamp = (module->sngtime / 1024.0) * GST_SECOND;
    drv_gst.Update ();
  } else {
    gst_element_set_eos (GST_ELEMENT (mikmod));
    gst_pad_push (mikmod->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS)));
  }
}
コード例 #3
0
ファイル: mloader.c プロジェクト: BigHNF/tcpmp-revive
/* Loads a module given a file pointer.
   File is loaded from the current file seek position. */
MIKMODAPI MODULE* Player_LoadFP(FILE* fp,int maxchan,BOOL curious)
{
	MODULE* result=NULL;
	struct MREADER* reader=_mm_new_file_reader (fp);

	if (reader) {
		result=Player_LoadGeneric(reader,maxchan,curious);
		_mm_delete_file_reader(reader);
	}
	return result;
}
コード例 #4
0
ファイル: mloader.c プロジェクト: idispatch/libmikmod
MIKMODAPI MODULE* Player_LoadMem(const char *buffer,int len,int maxchan,BOOL curious)
{
	MODULE* result=NULL;
	MREADER* reader;

	if ((reader=_mm_new_mem_reader(buffer, len))) {
		result=Player_LoadGeneric(reader,maxchan,curious);
		_mm_delete_mem_reader(reader);
	}
	return result;
}
コード例 #5
0
ファイル: mloader.c プロジェクト: AzagraMac/PS2_SDK
/* Open a module via an SDL_rwop.  The loader will initialize the specified
   song-player 'player'. */
MODULE* Player_LoadRW(SDL_RWops *rw,int maxchan,BOOL curious)
{
	MODULE* result=NULL;
	struct MREADER* reader=_mm_new_rwops_reader (rw);

	if (reader) {
		result=Player_LoadGeneric(reader,maxchan,curious);
		_mm_delete_rwops_reader(reader);
	}
	return result;
}
コード例 #6
0
ファイル: audio_mikmod.c プロジェクト: MrAlert/megazeux
static MODULE *MikMod_LoadSongRW(SDL_RWops *rw, int maxchan)
{
  struct LMM_MREADER lmmmr={
    { LMM_Seek, LMM_Tell, LMM_Read, LMM_Get, LMM_Eof },
    0, 0, rw
  };

  lmmmr.offset = SDL_RWtell(rw);
  SDL_RWseek(rw, 0, SEEK_END);
  lmmmr.eof = SDL_RWtell(rw);
  SDL_RWseek(rw, lmmmr.offset, SEEK_SET);

  return Player_LoadGeneric((MREADER *)&lmmmr, maxchan, 0);
}
コード例 #7
0
ファイル: modaud.c プロジェクト: 0xDEC0DE/uqm-0.6.4-ee
static bool
moda_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
{
    TFB_ModSoundDecoder* moda = (TFB_ModSoundDecoder*) This;
    uio_Stream *fp;
    MREADER* reader;
    MODULE* mod;

    fp = uio_fopen (dir, filename, "rb");
    if (!fp)
    {
        moda->last_error = errno;
        return false;
    }

    reader = moda_new_uioReader (fp);
    if (!reader)
    {
        moda->last_error = -1;
        uio_fclose (fp);
        return false;
    }

    mod = Player_LoadGeneric (reader, 8, 0);

    // can already dispose of reader and fileh
    moda_delete_uioReader (reader);
    uio_fclose (fp);
    if (!mod)
    {
        log_add (log_Warning, "moda_Open(): could not load %s", filename);
        return false;
    }

    moda->module = mod;
    mod->extspd = 1;
    mod->panflag = 1;
    mod->wrap = 0;
    mod->loop = 1;

    This->format = moda_formats->stereo16;
    This->frequency = md_mixfreq;
    This->length = 0; // FIXME way to obtain this from mikmod?

    moda->last_error = 0;

    return true;
}
コード例 #8
0
ファイル: memoryloader.c プロジェクト: sypherce/dslua
MIKMODAPI extern MODULE* Player_LoadMemory(const void* buffer, size_t size, int maxchan, BOOL curious)
{
    MODULE* module = 0;

    MMEMORYREADER* reader=(MMEMORYREADER*)malloc(sizeof(MMEMORYREADER));
    if (reader) {
        reader->core.Eof  = &MemoryReader_Eof;
        reader->core.Read = &MemoryReader_Read;
        reader->core.Get  = &MemoryReader_Get;
        reader->core.Seek = &MemoryReader_Seek;
        reader->core.Tell = &MemoryReader_Tell;
        reader->buffer = (const UBYTE*)buffer;
        reader->size = size;

        module = Player_LoadGeneric((MREADER*)reader, maxchan, curious);
        free(reader);
    }

    return module;
}
コード例 #9
0
ファイル: FAKE_mixer.c プロジェクト: arcadenea/fake_mixer
/* SDL_RWops compatibility */
Mix_Music *Mix_LoadMUS_RW(SDL_RWops *rw)
{
	//Sanity check: only MOD!
	if (detect_music_type(rw) != MUS_MOD){
		printf("Error: format not supported.\n");
		return NULL;
	}
	
	MODULE *module;
   	struct MREADER* reader = _mm_new_rwops_reader (rw);
   	if (reader) {
   		module = Player_LoadGeneric(reader,64,0);
		if(reader) free(reader);
		return (Mix_Music *) module;
   	}
   	else
	{
        printf("Could not load module, reason: %s\n", MikMod_strerror(MikMod_errno));
	}
	return NULL;
}
コード例 #10
0
ファイル: snd_mikmod.c プロジェクト: Darktori/vkQuake
static qboolean S_MIKMOD_CodecOpenStream (snd_stream_t *stream)
{
	mik_priv_t *priv;

	stream->priv = Z_Malloc(sizeof(mik_priv_t));
	priv = (mik_priv_t *) stream->priv;
	priv->reader.Seek = MIK_Seek;
	priv->reader.Tell = MIK_Tell;
	priv->reader.Read = MIK_Read;
	priv->reader.Get  = MIK_Get;
	priv->reader.Eof  = MIK_Eof;
	priv->fh = &stream->fh;

	priv->module = Player_LoadGeneric((MREADER *)stream->priv, 64, 0);
	if (!priv->module)
	{
		Con_DPrintf("Could not load module: %s\n", MikMod_strerror(MikMod_errno));
		Z_Free(stream->priv);
		return false;
	}

	/* keep default values of fadeout (0: don't fade out volume during when last
	 * position of the module is being played), extspd (1: do process Protracker
	 * extended speed effect), panflag (1: do process panning effects), wrap (0:
	 * don't wrap to restart position when module is finished) are OK with us as
	 * set internally by libmikmod::Player_Init(). */
	/* just change the loop setting to 0, i.e. don't process in-module loops: */
	priv->module->loop	= 0;
	Player_Start(priv->module);

	stream->info.rate	= md_mixfreq;
	stream->info.bits	= (md_mode & DMODE_16BITS)? 16: 8;
	stream->info.width	= stream->info.bits / 8;
	stream->info.channels	= (md_mode & DMODE_STEREO)? 2 : 1;
/*	Con_DPrintf("Playing %s (%d chn)\n", priv->module->songname, priv->module->numchn);*/

	return true;
}
コード例 #11
0
MOD_MUSIC_MODULE *MusicMod_LoadSongRW(SDL_RWops *rw, int maxchan)
{
    LMM_MF_READER lmmmr =
    {
        LMM_Seek,
        LMM_Tell,
        LMM_Read,
        LMM_Get,
        LMM_Eof,
        0,
        0,
        0/*rw*/
    };
    lmmmr.offset	= SDL_RWtell(rw);
    SDL_RWseek(rw, 0, SEEK_END);
    lmmmr.eof		= SDL_RWtell(rw);
    SDL_RWseek(rw, lmmmr.offset, SEEK_SET);
    lmmmr.rw		= rw;
    //
    MOD_MUSIC_MODULE *m;
    m				= Player_LoadGeneric((MF_READER*)&lmmmr, maxchan, 0);
    return (m);
}
コード例 #12
0
ファイル: mikmod.cpp プロジェクト: k1643/StratagusAI
/**
**  Load MikMod.
**
**  @param name   Filename of the module.
**  @param flags  Unused.
**
**  @return       Returns the loaded sample.
*/
CSample *LoadMikMod(const char *name, int flags)
{
	CSample *sample;
	MikModData *data;
	MODULE *module;
	CFile *f;
	char s[256];
	static int registered = 0;

	md_mode |= DMODE_STEREO | DMODE_INTERP | DMODE_SURROUND | DMODE_HQMIXER;
	MikMod_RegisterDriver(&drv_nos);
	if (!registered) {
		MikMod_RegisterAllLoaders();
		registered = 1;
	}

	strcpy_s(s, sizeof(s), name);
	f = new CFile;
	if (f->open(name, CL_OPEN_READ) == -1) {
		delete f;
		return NULL;
	}
	CurrentFile = f;

	MikMod_Init("");
	module = Player_LoadGeneric(&MReader, 64, 0);
	if (!module) {
		MikMod_Exit();
		f->close();
		delete f;
		return NULL;
	}

	if (flags & PlayAudioStream) {
		sample = new CSampleMikModStream;
		data = &((CSampleMikModStream *)sample)->Data;
	} else {
		sample = new CSampleMikMod;
		data = &((CSampleMikMod *)sample)->Data;
	}
	data->MikModFile = f;
	data->MikModModule = module;
	sample->Channels = 2;
	sample->SampleSize = 16;
	sample->Frequency = 44100;
	sample->Pos = 0;

	if (flags & PlayAudioStream) {
		sample->Len = 0;
		sample->Buffer = new unsigned char[SOUND_BUFFER_SIZE];

		Player_Start(data->MikModModule);
	} else {
		int read;
		int pos;

		// FIXME: need to find the correct length
		sample->Len = 55000000;
		sample->Buffer = new unsigned char[sample->Len];

		pos = 0;
		Player_Start(data->MikModModule);
		while (Player_Active()) {
			read = VC_WriteBytes((SBYTE *)sample->Buffer + pos,
				 sample->Len - pos);
			pos += read;
		}

		Player_Stop();
		Player_Free(data->MikModModule);
		MikMod_Exit();

		data->MikModFile->close();
		delete data->MikModFile;
	}

	return sample;
}