1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 #ifndef MAME_SOUND_MAS3507D_H
4 #define MAME_SOUND_MAS3507D_H
5 
6 #pragma once
7 
8 #define MINIMP3_ONLY_MP3
9 #define MINIMP3_NO_STDIO
10 #include "minimp3/minimp3.h"
11 
12 class mas3507d_device : public device_t, public device_sound_interface
13 {
14 public:
15 	// construction/destruction
16 	mas3507d_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
17 
sample_cb()18 	auto sample_cb() { return cb_sample.bind(); }
19 
20 	int i2c_scl_r();
21 	int i2c_sda_r();
22 	void i2c_scl_w(bool line);
23 	void i2c_sda_w(bool line);
24 
get_frame_count()25 	u32 get_frame_count() const { return total_frame_count - buffered_frame_count; }
26 
27 protected:
28 	virtual void device_start() override;
29 	virtual void device_reset() override;
30 	virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
31 
32 private:
33 	devcb_read16 cb_sample;
34 
35 	enum { IDLE, STARTED, NAK, ACK, ACK2 } i2c_bus_state;
36 	enum { UNKNOWN, VALIDATED, WRONG } i2c_bus_address;
37 
38 	std::array<u8, 0xe00> mp3data;
39 	std::array<mp3d_sample_t, MINIMP3_MAX_SAMPLES_PER_FRAME> samples;
40 	bool i2c_scli, i2c_sclo, i2c_sdai, i2c_sdao;
41 	int i2c_bus_curbit;
42 	uint8_t i2c_bus_curval;
43 	int mp3_count, sample_count, current_rate;
44 	u32 total_frame_count, buffered_frame_count;
45 
46 	mp3dec_t mp3_dec;
47 	mp3dec_frame_info_t mp3_info;
48 
49 	sound_stream *stream;
50 
51 	void i2c_nak();
52 	bool i2c_device_got_address(uint8_t address);
53 	void i2c_device_got_byte(uint8_t byte);
54 	void i2c_device_got_stop();
55 
56 	enum { UNDEFINED, CONTROL, DATA_READ, DATA_WRITE, BAD } i2c_subdest;
57 	enum { CMD_BAD, CMD_RUN, CMD_READ_CTRL, CMD_WRITE_REG, CMD_WRITE_MEM, CMD_READ_REG, CMD_READ_MEM } i2c_command;
58 	int i2c_bytecount;
59 	uint32_t i2c_io_bank, i2c_io_adr, i2c_io_count, i2c_io_val;
60 
61 	void mem_write(int bank, uint32_t adr, uint32_t val);
62 	void run_program(uint32_t adr);
63 	void reg_write(uint32_t adr, uint32_t val);
64 
65 	void fill_buffer();
66 	void append_buffer(std::vector<write_stream_view> &outputs, int &pos, int samples);
67 };
68 
69 
70 // device type definition
71 DECLARE_DEVICE_TYPE(MAS3507D, mas3507d_device)
72 
73 #endif // MAME_SOUND_MAS3507D_H
74