MP3s intern abspielen



  • Original erstellt von <tipp>:
    dann lass es!

    Hier wird man ja wirklich gut geholfen, geschweige denn Motiviert.
    Ok lass ichs halt, der kram is sowieso Schwul



  • würde dir code helfen, wie mans mit direct-x macht?



  • kann dir code geben, wie du es schaffst, mp3 abzuspielen mit fmod.
    es ist nicht so schwer...

    Devil



  • Original erstellt von devil81:
    **kann dir code geben, wie du es schaffst, mp3 abzuspielen mit fmod.
    es ist nicht so schwer...

    Devil**

    mir kannst du ihn auch geben;)
    Wäre schon mal interessant - habe sowas noch nie gemacht



  • Dann werd ich wohl meine FMOD klasse heute abend umschreiben 🙂

    Devil



  • Original erstellt von devil81:
    **kann dir code geben, wie du es schaffst, mp3 abzuspielen mit fmod.
    es ist nicht so schwer...

    Devil**

    Danke wäre nett 🙂
    Wenigstens einer der mir helfen will



  • Original erstellt von Perner:
    Danke wäre nett 🙂
    Wenigstens einer der mir helfen will

    zwei. aber meinen willste ja nicht.



  • Original erstellt von volkard:
    **
    zwei. aber meinen willste ja nicht.**

    lern du erst mal c++ 😃 😉 :p

    Devil

    [ Dieser Beitrag wurde am 14.11.2002 um 14:15 Uhr von devil81 editiert. ]



  • Original erstellt von devil81:
    **lern du erst mal c++ 😃 😉 :p
    **

    Kann es sein, daß Du mich mit jemandem verwechselst?



  • Original erstellt von volkard:
    **
    Kann es sein, daß Du mich mit jemandem verwechselst?**

    Das war ironisch gemeint...
    Besser als du kann es hier denk ich keiner...

    Devil

    [ Dieser Beitrag wurde am 14.11.2002 um 15:29 Uhr von devil81 editiert. ]



  • Original erstellt von devil81:
    **Besser als du kann es hier denk ich keiner...
    **

    jo, keiner in meinem wohnzimmer. *g*
    aber bevor wir uns ins vegleichen vertiefen, ein müßiges thema, lenk ich mal mit meiner mp3-klasse ab.
    dx ist nämlich in seltenen fällen gar nicht so schwer. das problem sind die dokus von ms, die offensichtlich absichtlich noch komplizierter geschrieben wurden als der c++-standard.

    //copyright by Volkard
    #include <windows.h>  
    #include <control.h>
    #include <strmif.h>
    #include <uuids.h>
    #include <evcode.h>
    #include <errors.h>
    #pragma comment(lib,"strmiids")
    #pragma comment(lib,"quartz")
    
    void check(HRESULT hResult)
    {
        if(FAILED(hResult))
            throw hResult;
    }
    
    class Mp3Player
    {
    private:
        IGraphBuilder* pigb;
        IMediaControl* pimc;
        IMediaEvent* pime;
        IMediaPosition* pimp;
        WCHAR* fileName;
    public:
        Mp3Player()
            :pigb(0)
            ,pimc(0)
            ,pime(0)
            ,pimp(0)
        {
            check(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pigb));
            check(pigb->QueryInterface(IID_IMediaControl,(void **)&pimc));
            check(pigb->QueryInterface(IID_IMediaEvent,(void **)&pime));
            check(pigb->QueryInterface(IID_IMediaPosition,(void **)&pimp));
        }
        ~Mp3Player()
        {
            if(pime) pime->Release();
            if(pimc) pimc->Release();
            if(pigb) pigb->Release();
            if(pimp) pimp->Release();
        }
        void PlayFile (WCHAR* wFile)
        {
            check(pigb->RenderFile(wFile, NULL));
            check(pimc->Run());
        }
        double getCurrentPos()
        {
            REFTIME curTime;
            check(pimp->get_CurrentPosition(&curTime));
            return curTime;
        }
        double getDuration()
        {
            REFTIME maxTime;
            check(pimp->get_Duration(&maxTime));
            return maxTime;
        }
        bool isRunning()
        {
            LONG completion;
            pime->WaitForCompletion(0,&completion);
            return completion!=EC_COMPLETE;
        }
    };
    

    und ne kleine main, genau die, die mich seit wochen mit musik bedudelt:

    #pragma warning(disable:4786)
    
    #include "mp3.h"
    #include <conio.h>
    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <algorithm>
    #include <ctime>
    using namespace std;
    
    void test()
    {
        vector<string> files;
        ifstream in("dir.txt");
        string file;
        while(getline(in,file))
        {
            files.push_back(file);
        }
        random_shuffle(files.begin(),files.end());
        for(vector<string>::iterator i=files.begin();i!=files.end();++i)
        {
            cout<<*i<<endl;
            try
            {
                WCHAR *wFile=new WCHAR[i->size()+1];
                MultiByteToWideChar(CP_ACP,0,i->c_str(),-1,wFile,i->size()+1);
                Mp3Player m;
                m.PlayFile(wFile);
                while(m.isRunning())
                {
                    cout.setf(ios::fixed);
                    cout<<setprecision(1);
                    cout<<m.getCurrentPos();
                    cout<<'/';
                    cout<<m.getDuration();
                    cout<<'\r'<<flush;
                    Sleep(100);
                    if(kbhit())
                    {
                        switch(getch())
                        {
                        case 's':
                            goto raus;
                            break;
                        case 'q':
                            return;
                        }
                    }
                }
            }
            catch(HRESULT hResult)
            {
                TCHAR text[MAX_ERROR_TEXT_LEN];
                AMGetErrorText(hResult,text,MAX_ERROR_TEXT_LEN);
                cout<<"Error: "<<text<<endl;
            }
    raus:;
        }
    }
    
    int main(int, char** argv)
    {
        srand(time(0));
        CoInitialize(0);
        test();
        CoUninitialize();
        return 0;
    }
    

    hoffentlich sieht PeterTheMaster das goto dort und verbietet es mir.



  • thx für den Code, aber was ist mit getCurrentPos gemeint?
    Soll ich da jetzt selber nen Schieberegler einfügen oder ist das für die ActiveX Windows Media Komponente gedacht?



  • Damit ist gemeint wo dein rechter Lautsprecher gerade steht.



  • Original erstellt von Perner:
    thx für den Code, aber was ist mit getCurrentPos gemeint?
    Soll ich da jetzt selber nen Schieberegler einfügen oder ist das für die ActiveX Windows Media Komponente gedacht?

    völlig egal, ob du die aktuelle position anzeigen willst, oder es sein läßt, und wenn, wie du sie anzeigst.



  • @Volkard
    Wusste noch garnicht das das hier dein Wohnzimmer ist 😉

    Naja, hier mal meine Klasse:
    fmod.h :

    #include <fmod.h>
    #include <fmod_errors.h>
    
    class CFmod  
    {
    public:
        bool Stop();
        bool Play();//-1 bei error
        bool Load(const char * Path, bool bplay);//läd die Mp3, entweder entpackt sie auf die Festplatte, oder läd sie direkt in den arbeitspeicher
        bool InitFmod(HWND Wnd, unsigned int soundchannel);
        CFmod();
        virtual ~CFmod();
    protected:
        bool start; // sicherstellen das init aufgerufen wird.
        unsigned int channel;
        FSOUND_STREAM* m_stream;//fmod variable für das handeln der mp3 datei
        char * data; // für die gelandenen daten.
        HWND hWnd;// window handle
    
    };
    

    fmod.cpp

    #include "Fmod.h"
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    CFmod::CFmod()
    {
        hWnd = NULL;
        m_stream = NULL;
        data = NULL;
        channel = 0;
        start = false;
    }
    
    CFmod::~CFmod()
    {
        delete [] data;
    }
    
    bool CFmod::Load(const char *Path, bool bplay)
    {
        if(start)
        {
        if(data!=NULL)
        {
            delete[] data;
            data=NULL;
        }
        if(bplay)
        {   
        FILE* datei;
        int length;
        m_stream=NULL;
        datei=fopen(Path,"r");
        fseek(datei, 0, SEEK_END);
        length = ftell(datei);
        fseek(datei, 0, SEEK_SET);
        data=new char[length];
        fread(data, length, 1, datei);
        fclose(datei);
        m_stream = FSOUND_Stream_OpenFile(data, FSOUND_NORMAL /*| FSOUND_LOOP_NORMAL*/ | FSOUND_2D /*/| FSOUND_MPEGACCURATEFSOUND_LOADMEMORY*/, length);
        }
        else
        {
            m_stream = FSOUND_Stream_OpenFile(Path, FSOUND_NORMAL /*| FSOUND_LOOP_NORMAL*/ | FSOUND_2D | FSOUND_MPEGACCURATE, 0);
        }
        if(!m_stream)
        {
            m_stream=NULL;
            return false;
        }
        else
            return true;
        }
    }
    
    bool CFmod::Play()//hm, spielt
    {
        if(start)
        {
        if(m_stream != NULL)
        {                         
            channel = FSOUND_Stream_Play(channel, m_stream);
            if (channel < 0)
                return false;
            else
                return true;
        }
        }
    }
    
    bool CFmod::InitFmod(HWND Wnd, unsigned int soundchannel)//Initialisiert FMOD
    {
        start = true;
        hWnd = Wnd;
        channel = soundchannel;
        int outputfreq = 44100;
        int setting_output=0;
        int setting_driver=0;
        int setting_mixer=0;
        setting_output = FSOUND_OUTPUT_DSOUND;
    
        FSOUND_SetBufferSize(200);
        FSOUND_SetOutput(setting_output);
        FSOUND_SetDriver(setting_driver);
        FSOUND_SetMixer(setting_mixer);
        FSOUND_SetHWND(hWnd);
    
        FSOUND_Init(outputfreq,128, 0);
    
        if (FSOUND_GetVersion() < FMOD_VERSION)
        {
            MessageBox(hWnd, FMOD_ErrorString(FSOUND_GetError()),"FMOD FEHLER",MB_OK);
        }
        if (!FSOUND_Init(44100, 32, FSOUND_INIT_GLOBALFOCUS))
        {
            MessageBox(hWnd, FMOD_ErrorString(FSOUND_GetError()),"FMOD FEHLER",MB_OK);
            return false;
            exit(1);
        }
        return true;
    }
    
    bool CFmod::Stop()
    {
        return FSOUND_Stream_Stop(m_stream);
    }
    

    So, das ist meine Klasse, musst noch die fmodvc.lib inkludieren, und die
    dll laden. sonst nix.

    Devil

    [ Dieser Beitrag wurde am 14.11.2002 um 18:48 Uhr von devil81 editiert. ]


Anmelden zum Antworten