Originally Posted by txesmi
Hi,
you can access the buffer of a sound but a real time analysis would be pretty intensive. Take into account that it would play hundreds of samples between frames.

Code
#include <acknex.h>
#include <d3d9.h>

#define PRAGMA_PATH "%EXE_DIR%\\templates\\sounds"

/*
typedef struct DSBUFFERDESC {
    DWORD dwSize;
    DWORD dwFlags;
    DWORD dwBufferBytes;
    DWORD dwReserved;
    LPWAVEFORMATEX lpwfxFormat;
    GUID guid3DAlgorithm;
} DSBUFFERDESC;

typedef struct {
  WORD  wFormatTag;
  WORD  nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD  nBlockAlign;
  WORD  wBitsPerSample;
  WORD  cbSize;
} WAVEFORMATEX;
*/

SOUND *snd = "shot4.wav";
//SOUND *snd = "tdestroyed.wav";
//SOUND *snd = "#1";

var step = 70;

void draw8bits(var posStart, short *bit, int length)
{
	VECTOR vec;
	vec_set(&vec, vector(posStart, 150, 0));
	draw_line(&vec, NULL, 100);
	draw_line(&vec, COLOR_WHITE, 100);
	
	var posX = posStart;
	var posY = 250;
	int i = 0;
	for(; i < length; i += 2, bit += 1)
	{
		vec.x += 1;
		vec.y = 150.0 + (*bit - 32896.0) / 32896.0 * 100.0;
		if(vec.x > 0)
			draw_line(&vec, COLOR_WHITE, 100);
		
		if(posX > 0)
			draw_text(str_for_int(NULL, *bit), posX, posY, COLOR_WHITE);
		
		posY += 8;
		if(!(vec.x % step))
		{
			posY = 250;
			posX += step;
			if(posX > screen_size.x)
				break;
		}
	}
	draw_line(&vec, NULL, 100);	
}

void draw16bits(var posStart, long *bit, int length)
{
	VECTOR vec;
	vec_set(&vec, vector(posStart, 150, 0));
	draw_line(&vec, NULL, 100);
	draw_line(&vec, COLOR_WHITE, 100);
	
	var posX = posStart;
	var posY = 250;
	int i = 0;
	for(; i < length; i += 4, bit += 1)
	{
		vec.x += 1;
		vec.y = 150.0 + *bit / 2147483648.0 * 100.0;
		if(vec.x > 0)
			draw_line(&vec, COLOR_WHITE, 100);
		
		if(posX > 0)
			draw_text(str_for_int(NULL, *bit), posX, posY, COLOR_WHITE);
		
		posY += 8;
		if(!(vec.x % step))
		{
			posY = 250;
			posX += step;
			if(posX > screen_size.x)
				break;
		}
	}
	draw_line(&vec, NULL, 100);	
}

void main()
{
	video_mode = 10;
	fps_max = 60;
	
	wait(1);
	draw_textmode("Courier New", 0, 12, 100);
	
	var posStart = 1;
	
	var keyL = 0;
	var keyR = 0;
	var timer = 0;
	
	while(!key_esc)
	{
		DSBUFFERDESC *dsBufferDesc;
		byte** pSampleBuffer;
		snd_buffer(snd, &dsBufferDesc, &pSampleBuffer);
		
		// sound data
		draw_text(str_printf(NULL, "size:         %d", dsBufferDesc->dwSize),                       0,  0, COLOR_WHITE);
		draw_text(str_printf(NULL, "buffer bytes: %d", dsBufferDesc->dwBufferBytes),                0, 10, COLOR_WHITE);
		
		draw_text(str_printf(NULL, "channels:     %d", dsBufferDesc->lpwfxFormat.nChannels),      200,  0, COLOR_WHITE);
		draw_text(str_printf(NULL, "bytes sample: %d", dsBufferDesc->lpwfxFormat.wBitsPerSample), 200, 10, COLOR_WHITE);
		draw_text(str_printf(NULL, "bytes sec:    %d", dsBufferDesc->lpwfxFormat.nSamplesPerSec), 200, 20, COLOR_WHITE);
		
		// move drawing
		if(key_cul && !keyL)
		{
			timer = 0;
			posStart -= step;
		}
		else if(key_cul)
		{
			timer += time_step;
			if(timer > 2)
			{
				timer = 0;
				posStart -= step;
			}
		}
		keyL = key_cul;
		
		if(key_cur && !keyR)
		{
			timer = 0;
			posStart += step;
		}
		else if(key_cur)
		{
			timer += time_step;
			if(timer > 2)
			{
				timer = 0;
				posStart += step;
			}
		}
		keyR = key_cur;
		
		// draw
		switch((int)dsBufferDesc->lpwfxFormat.wBitsPerSample)
		{
			case 8:
				draw8bits(posStart, *pSampleBuffer, dsBufferDesc->dwBufferBytes);
				break;
			case 16:
				draw16bits(posStart, *pSampleBuffer, dsBufferDesc->dwBufferBytes);
				break;
			default:
				draw_text("Unknown format!", 0, 250, COLOR_WHITE);
		}
		
		wait(1);
	}
	
	sys_exit(NULL);
}


Salud!


This help very much, thank you !!! laugh


A8 PRO 8.47.1