Sampledaten



  • Hallo!

    Ich habe mir bei codeproject Fister(http://www.codeproject.com/audio/fister.asp) runtergeladen. Das Programm das Programm nimmt das Audiosignal, was übers Mikro reinkommt auf un kann dieses speichern und auch wiedergeben.
    Ich habe damit allerdings ein Problem: Irgendwie muss ich an die Sampledaten rankommen. Ich habe nämlich keine ahnung welche der Variablen genau die Sampledaten darstellt.

    Ich gehe davon aus, dass die Sampledaten in dieser Pointerunion gespeichert werden(ich weiß es aber nicht so genau), allerdings weiß ich nicht welche und wie ich die daten auslesen kann:

    union PointerUnion{
    		BYTE*		b;
    		char*		c;
    		WORD*		w;
    		short int*	s;
    		DWORD*		d;
    		int*		i;
    		float*		f;
    		double*		r;	// real
    		void*		v;
    	}ptr;
    

    Liege ich damit richtig, dass die Sampledaten darin zu finden sind oder nicht? Wie kann ich die dinger denn auslesen?

    MFG

    Hansi



  • Steht diese Union etwa für sich alleine da? Nach meinem Verständnis müsste/sollte die im Inneren eines structs untergebracht sein, das dann auch dazusagt, welcher der Pointer(typen) gültig ist und wieviele Datensätze du hast.



  • Danke! Also diese Pointerunion ist Teil einer Klasse namens Buffer, der dann später in die zu speichernde Wav-datei geschrieben wird.

    // Buffer.cpp: implementation of the CBuffer class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "stdafx.h"
    #include "Buffer.h"
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    CBuffer::CBuffer(DWORD size, bool AutoDelete)
    {
    	m_bAutoDelete = AutoDelete;
    	try
    	{
    		ptr.b = new BYTE[size];
    		if(ptr.b) ByteLen = size;
    	}
    	catch(...)
    	{
    		ErrorMsg("Out of memory!");
    	}
    }
    
    CBuffer::CBuffer(void* buffer, DWORD length)
    {
    	m_bAutoDelete = false;
    	if(buffer)
    	{
    		ptr.v = buffer;
    		ByteLen = length;
    	}
    	else
    	{
    		ptr.b = NULL;
    		ByteLen = 0;
    	}
    }
    
    CBuffer::~CBuffer()
    {
    	// remember to delete the memory
    	if(m_bAutoDelete && ptr.b != NULL)  delete ptr.b;
    }
    
    void CBuffer::Erase()
    {
    	if(ptr.b) ZeroMemory(ptr.b,ByteLen);
    }
    
    // Buffer.h: interface for the CBuffer class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_BUFFER_H__B4B9CF06_B948_49A5_9145_ECB3E318BF05__INCLUDED_)
    #define AFX_BUFFER_H__B4B9CF06_B948_49A5_9145_ECB3E318BF05__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include "errorprint.h"
    
    class CBuffer  
    {
    public:
    	void Erase();
    	CBuffer(DWORD size, bool AutoDelete = true);
    	CBuffer(void* buffer, DWORD length);
    	virtual ~CBuffer();
    
    	union PointerUnion{
    		BYTE*		b;
    		char*		c;
    		WORD*		w;
    		short int*	s;
    		DWORD*		d;
    		int*		i;
    		float*		f;
    		double*		r;	// real
    		void*		v;
    	}ptr;
    
    	int	ByteLen;	// length in bytes
    
    private:
    	bool	m_bAutoDelete;
    };
    
    #endif // !defined(AFX_BUFFER_H__B4B9CF06_B948_49A5_9145_ECB3E318BF05__INCLUDED_)
    

    Also so werden dann die Sampledaten in die Wavdatei geschrieben:

    mmioWrite(m_hFile, buffer->ptr.c, buffer->ByteLen);
    

    Aber wenn ich buffer->ptr.c mit memcpy in einen Array x kopiere, ist der Array x immer 0. Deshalb kann ich natürlich auch die FFT-Funktion nicht aufrufen.
    Wie komm ich denn an die Sampledaten ran?

    Danke

    MFG

    Hansi


Anmelden zum Antworten