Tonerzeugung



  • Also WriteIoPortByte(0x42,0x11CA). Oder ist das jetzt gänzlich falsch? Ich muss ja weiterhin auch noch auf MSB und LSB achten irgendwie?!

    ich nehme an, WriteIoPortByte schreibt immer nur ein Byte.
    Müsstest also 0x11CA aufteilen in zwei Bytes, also 0x11 und 0xCA.
    Und dann zweimal aufrufen:
    WriteIoPortByte(0x42,0xCA); // LSB
    WriteIoPortByte(0x42,0x11); // MSB



  • Ahhh ok, ja das klingt einleuchtend.
    Und dann sollte schon ein Ton heraus kommen?



  • Patrick1990 schrieb:

    Ahhh ok, ja das klingt einleuchtend.
    Und dann sollte schon ein Ton heraus kommen?

    probiers doch einfach 😉



  • Ok, ich bekomme folgende Mitteilung:

    http://fs1.directupload.net/images/150507/temp/rtngsoin.png

    Scheinbar ist das unter Parallels Desktop nicht möglich.



  • Steht doch eh da was (vermutlich) das Problem ist.
    Stell dein Projekt auf Win32 um und probier es nochmal.



  • Wenn ich das unter Project --> Properties ändere erscheinen mir mehrere Fehlermeldungen:

    1>------ Build started: Project: A2_Tonerzeugung, Configuration: Debug Win32 ------
    1>Tonerzeugung.obj : error LNK2019: unresolved external symbol "unsigned long __stdcall GetDllStatus(void)" (?GetDllStatus@@YGKXZ) referenced in function _main
    1>Tonerzeugung.obj : error LNK2019: unresolved external symbol "int __stdcall InitializeOls(void)" (?InitializeOls@@YGHXZ) referenced in function _main
    1>Tonerzeugung.obj : error LNK2019: unresolved external symbol "void __stdcall DeinitializeOls(void)" (?DeinitializeOls@@YGXXZ) referenced in function _main
    1>Tonerzeugung.obj : error LNK2019: unresolved external symbol "void __stdcall WriteIoPortByte(unsigned short,unsigned char)" (?WriteIoPortByte@@YGXGE@Z) referenced in function _main
    1>\\psf\Home\Desktop\A2_Tonerzeugung\Debug\A2_Tonerzeugung.exe : fatal error LNK1120: 4 unresolved externals
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    Vielleicht sollte ich besser ein 64-Bit Betriebssystem aufspielen?



  • Du mußt dem Linker noch die Library (.lib-Datei) zu der "OlsApi.h" mitgeben (+ evtl. noch die Linkerpfade anpassen).



  • Oha davon habe ich keine Ahnung. Wie geht sowas?



  • Projekteigenschaften, Linker, Eingabe bzw. Input, und dann den Pfad zur LIB angeben.

    Siehe auch Internet, hier erster Treffer auf stackoverflow:

    http://stackoverflow.com/questions/20058864/how-to-include-libraries-in-visual-studio-2012



  • Das sieht aus als wolltest Du über den PC-Speaker Sound ausgeben.
    Da kann man aus dem alten Buch PC-Intern von Michael Tischler (DATA-BECKER)
    dessen Interuptierende Sprachausgabe betrachten.

    Unter Windows kannst Du zb. einen Text sprechen lassen wie folg:

    PseudoCode:

    #include <sphelper.h>
    static unsigned __stdcall ClientSay(void *ptr)
    {
    	CString str((char *)ptr);
    	if (FAILED(::CoInitialize(NULL)))return 0;
    	CComPtr<ISpVoice>              cpVoice;
    	CComPtr<ISpObjectToken>        cpVoiceToken;
    	CComPtr<IEnumSpObjectTokens>   cpEnum;
    	ULONG                          ulCount(0);
    	if (FAILED(cpVoice.CoCreateInstance(CLSID_SpVoice)))return 0;
    	if (FAILED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum)))return 0;
    	if (FAILED(cpEnum->GetCount(&ulCount)))return 0;
    	cpVoiceToken.Release();
    	if (FAILED(cpEnum->Next(1, &cpVoiceToken, NULL)))return 0;
    	if (FAILED(cpVoice->SetVoice(cpVoiceToken)))return 0;
    	cpVoice->Speak(str.AllocSysString(), SPF_ASYNC, NULL);
    	while (cpVoice->WaitUntilDone(33) == S_FALSE);
    	::CoUninitialize();
    	return 0;
    }
    

    Ansonnsten kannst Du alle Frequenzen über die AudioHardware ausgeben:

    CAudioFreqGen::CAudioFreqGen(void)
    {
    	uDeviceID           = WAVE_MAPPER;
    	pwfx                = NULL;
    	dwCallback          = NULL;
    	dwCallbackInstance  = NULL;
    	fdwOpen             = CALLBACK_NULL;
    	unsigned char *buf  = NULL;
    	m_lastfrq           = 0;
        ghwo                = 0;              
    	PrepareDevice();
    }
    
    CAudioFreqGen::~CAudioFreqGen(void)
    {
    	CloseDevice();
    }
    
    char *CAudioFreqGen::PrepareDevice(void)
    {
     pwfx=new WAVEFORMATEX;
     pwfx->wFormatTag=WAVE_FORMAT_PCM;
     pwfx->nChannels=1;
     pwfx->nSamplesPerSec=SPS;
     pwfx->nAvgBytesPerSec=SPS;
     pwfx->nBlockAlign=1;
     pwfx->wBitsPerSample=8;
     mmres=waveOutOpen(&ghwo,uDeviceID,pwfx,dwCallback,dwCallbackInstance,fdwOpen);
     delete pwfx;
     if(mmres != MMSYSERR_NOERROR)
     {
      return "Cant open device.";
     }
     buf=new unsigned char[SPS];
     if(buf == NULL)
     {
      CloseDevice();
      return "Cant allocate memory.";
     }
     memset(buf,0,SPS);
     pwh.lpData=(LPSTR)buf;
     pwh.dwBufferLength=SPS;
     pwh.dwFlags=WHDR_BEGINLOOP;
     pwh.dwLoops=1;
     mmres = waveOutPrepareHeader(ghwo,&pwh,sizeof(pwh));
     pwh.dwFlags=WHDR_BEGINLOOP|WHDR_ENDLOOP|WHDR_PREPARED;
     pwh.dwLoops=0xFFFFFFFF;                // Number of loops == about 136 years:)
     if(mmres != MMSYSERR_NOERROR)
     {
      CloseDevice();
      return "Device prepare error.";
     }
    
     return NULL;
    }
    
    //---------------------------------------------------------------------------
    
    char *CAudioFreqGen::CloseDevice(void)
    {
     if(buf) delete [] buf;
    
     if(ghwo)
     {
    	mmres=waveOutReset(ghwo);
    	if(mmres != MMSYSERR_NOERROR)
    	return "Cant close device.";
    	mmres=waveOutClose(ghwo);
    	if(mmres != MMSYSERR_NOERROR)
    	return "Cant close device.";
    
    	ghwo = 0;
     }
    
     return NULL;
    }
    
    //---------------------------------------------------------------------------
    void CAudioFreqGen::Generate(int freq,char amp,float phase)
    {
     if(ghwo)
      if(m_lastfrq != freq)
      {
    	m_lastfrq = freq;
    	char tmp[SPS];
    	register float x=freq*2*3.1416/SPS;
    	for(int cnt=0;cnt<SPS;cnt++)
    	 tmp[cnt]=(unsigned char)(cos(phase+cnt*x)*amp+127);
    	memcpy(&buf[0],&tmp[0],SPS);
      }
    }
    

    Grüße und Erfolg
    Karsten



  • Ich habe nun noch einmal ein 64-Bit Windows als virtuelle Maschine laufen. Nun läuft das Programm, jedoch gibt er aus: Rueckgabewert=5. Er müsste eigentlich ja 0 sein.


Anmelden zum Antworten