Beispiel #1
0
	void Stream::WriteData(const StreamBuffer& value)
	{
		if (streamMode == SmMemory)
		{
			ExpandMemoryStream(value.size());
			std::memcpy(buffer.data() + position, value.data(), value.size());
			position += value.size();
		}
		else
			fileStream.write(reinterpret_cast<const char*>(value.data()), value.size());
	}
Beispiel #2
0
	void Stream::ReadData(const StreamBuffer& value)
	{
		if (streamMode == SmMemory)
		{
			unsigned int size = std::max(static_cast<int>(value.size()), static_cast<int>(value.size() - buffer.size()));
			std::memcpy((void*)value.data(), buffer.data() + position, size);
			position += value.size();
		}
		else
			fileStream.read(reinterpret_cast<char*>(const_cast<unsigned char*>(value.data())), value.size());
	}
int main(int, char const* const*)
{
    try
    {
        using libember::util::StreamBuffer;

        StreamBuffer<unsigned short, 256> testStream;
        for (unsigned int i = 0; i < 1000; ++i)
        {
            {
                unsigned short writeBuffer[7];
                for (unsigned int j = 0; j < 7; ++j)
                {
                    writeBuffer[j] = static_cast<unsigned short>(i * 7 + j);
                }
                unsigned short const* const begin = writeBuffer;
                unsigned short const* const end   = writeBuffer + sizeof(writeBuffer) / sizeof(writeBuffer[0]);
                testStream.append(begin, end);
            }
            for (unsigned int j = 0; j < 5; ++j)
            {
                unsigned short const current = testStream.front();
                testStream.consume();
                if (current != (i * 5 + j))
                {
                    THROW_TEST_EXCEPTION("Invalid head of buffer! Expected " << (i * 5 + j) << ", found " << current);
                }
            }
            std::size_t const size = testStream.size();
            if (size != 2 * (i + 1))
            {
                THROW_TEST_EXCEPTION("Invalid size of buffer! Expected " << ((i + 1) * 2) << ", found " << size);
            }
        }
        for (unsigned int i = 0; i < 1000; ++i)
        {
            for (unsigned int j = 0; j < 2; ++j)
            {
                unsigned short const current = testStream.front();
                testStream.consume();
                if (current != (5000 + i * 2 + j))
                {
                    THROW_TEST_EXCEPTION("Invalid head of buffer! Expected " << ((i + 1000) * 5 + j) << ", found " << current);
                }
            }
        }
    }
    catch (std::exception const& e)
    {
        std::cerr << "ERROR: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}
Beispiel #4
0
	long ClientWriter::put_chunk(StreamBuffer entity){
		PROFILE_ME;

		if(entity.empty()){
			LOG_POSEIDON_ERROR("You are not allowed to send an empty chunk");
			DEBUG_THROW(BasicException, sslit("You are not allowed to send an empty chunk"));
		}

		StreamBuffer chunk;

		char temp[64];
		unsigned len = (unsigned)std::sprintf(temp, "%llx\r\n", (unsigned long long)entity.size());
		chunk.put(temp, len);
		chunk.splice(entity);
		chunk.put("\r\n");

		return on_encoded_data_avail(STD_MOVE(chunk));
	}
Beispiel #5
0
int main(int argc, char **argv){
  const int freq = 16000;

  // declare stream buffer ------------------------------------------------------------
  StreamBuffer<float> inBuffer;
  StreamBuffer<float> Buffer_H_short;
  StreamBuffer<float> Buffer_P_short;
  StreamBuffer<float> Buffer_H_long;
  StreamBuffer<float> Buffer_P_long;
  StreamBuffer<float> Buffer_karaoke;
  StreamBuffer<float> outBuffer;

//  StreamBuffer<float> Buffer_H_long_tmp;

	// Audio IO -------------------------------------------------------------------------
	AudioDevice* audio_thread = AudioDevice::getInstance();
	audio_thread->init(1, freq, 1024, &inBuffer, &outBuffer);

	// HPSS short ------------------------------------------------------------------------
//	HPSS_pipe HPSS_short(7, 256, 128, 10, 10);
	HPSS_pipe HPSS_short(7, 512, 256, 10, 10);
//	HPSS_short.setBuffer(&inBuffer, &Buffer_H_short, &Buffer_P_short);
	HPSS_short.setBuffer(&Buffer_P_long, &Buffer_H_short, &Buffer_P_short);

	// HPSS long --------------------------------------------------------------------------
//	HPSS_pipe HPSS_long(10, 4096, 2048, 10, 10);
//	HPSS_pipe_long HPSS_long(7, 4096, 2048, 10, 10);
//	HPSS_pipe HPSS_long(7, 2048, 1024, 15, 10);

	HPSS_pipe HPSS_long(7, 2048, 1024, 10, 10);

//	HPSS_long.setBuffer(&Buffer_H_short, &Buffer_H_long,  &Buffer_P_long);
	HPSS_long.setBuffer(&inBuffer, &Buffer_H_long,  &Buffer_P_long);
//	HPSS_long.set_filter_a(400);


  // GUI --------------------------------------------------------------------------------
  GUI panel(argc, argv);

	// Timbre changer ---------------------------------------------------------------------
	// too heavy
/*
  Filter equalizer_H(256, 128);
  equalizer_H.setBuffer(&Buffer_H_long, &Buffer_H_long_tmp);
	equalizer_H.set_filter_a(300.);
	equalizer_H.set_filter_b(500.);
*/

  // Adder ------------------------------------------------------------------------------
  StreamAdder adder(2048, &panel); // GUIはパラメータではなくて逆にする。
  adder.add_input_stream(&Buffer_P_short); adder.set_multiply(0, 1.0);
  adder.add_input_stream(&Buffer_H_long);  adder.set_multiply(1, 1.0);
//  adder.add_input_stream(&Buffer_P_long);  adder.set_multiply(2, 0.0); // control through GUI (todo)
  adder.add_input_stream(&Buffer_H_short);  adder.set_multiply(2, 0.0); // control through GUI (todo)
  adder.set_output_stream(&Buffer_karaoke);

  // PitchConversion ---------------------------------------------------------------------
  TempoPitch converter;
//  converter.init(1024, 128, 1,  7, 10, freq, &panel);//パラメータは?
//  converter.init(1024, 128, 1 /* channel */,  7 /* block */, 12 /* coeff */, freq, &panel);//
  converter.init(1024 * 2, 128 * 2, 1 /* channel */,  7 /* block */, 15 /* coeff */, freq, &panel);//param? // frame should be very long
//  converter.init(1024 * 4, 128 * 4, 1 /* channel */,  7 /* block */, 12 /* coeff */, freq, &panel);//
  	//coeff 5, 7 change timbre. 12 OK. 40 too large
  converter.setBuffer(&Buffer_karaoke, &outBuffer);

	// start  ---------------------------------------------------------------------------
//	equalizer_H.start();
	audio_thread->start();
	HPSS_short.start();
	HPSS_long.start();
	adder.start();
	converter.start();
	panel.start();

	// display something every 1[s] -----------------------------------------------------------------
	int sec = 0;
	while(1){
		sec++;
		usleep(1000000);
		fprintf(stderr, "%3d[ms]  %3d[ms]  %3d[ms] \t HPSS: short %d[times/s] long %d[times/s] phase %d[times/s] audio trial %d \n",
			(int)((double)inBuffer.size() / freq * 1000),
			(int)((double)Buffer_karaoke.size() / freq * 1000),
			(int)((double)outBuffer.size() / freq * 1000),
			HPSS_short.get_exec_count_diff(),
			HPSS_long. get_exec_count_diff(),
			converter. get_exec_count_diff(),
			audio_thread->get_exec_count()
		);

		fprintf(stderr, "sec: %d min %d sec         \t ave:  short %d[times/s] long %d[times/s] phase %d[times/s] \n\n",
			sec / 60,
			sec % 60,
			HPSS_short.get_exec_count_ave(),
			HPSS_long. get_exec_count_ave(),
			converter. get_exec_count_ave()
		);

		if(panel.getstop()){audio_thread->stop();}
		if(panel.getquit()){break;}

  }

  audio_thread->kill();
  // GUI kill
  return 0;
}
Beispiel #6
0
	long ClientWriter::put_request(RequestHeaders request_headers, StreamBuffer entity){
		PROFILE_ME;

		StreamBuffer data;

		data.put(get_string_from_verb(request_headers.verb));
		data.put(' ');
		data.put(request_headers.uri);
		if(!request_headers.get_params.empty()){
			data.put('?');
			data.put(url_encoded_from_optional_map(request_headers.get_params));
		}
		char temp[64];
		const unsigned ver_major = request_headers.version / 10000, ver_minor = request_headers.version % 10000;
		unsigned len = (unsigned)std::sprintf(temp, " HTTP/%u.%u\r\n", ver_major, ver_minor);
		data.put(temp, len);

		AUTO_REF(headers, request_headers.headers);
		if(entity.empty()){
			headers.erase("Content-Type");
			headers.erase("Transfer-Encoding");

			if((request_headers.verb == V_POST) || (request_headers.verb == V_PUT)){
				headers.set(sslit("Content-Length"), STR_0);
			} else {
				headers.erase("Content-Length");
			}
		} else {
			if(!headers.has("Content-Type")){
				headers.set(sslit("Content-Type"), "application/x-www-form-urlencoded; charset=utf-8");
			}

			AUTO(transfer_encoding, headers.get("Transfer-Encoding"));
			AUTO(pos, transfer_encoding.find(';'));
			if(pos != std::string::npos){
				transfer_encoding.erase(pos);
			}
			transfer_encoding = to_lower_case(trim(STD_MOVE(transfer_encoding)));

			if(transfer_encoding.empty() || (transfer_encoding == STR_IDENTITY)){
				headers.set(sslit("Content-Length"), boost::lexical_cast<std::string>(entity.size()));
			} else {
				// 只有一个 chunk。
				StreamBuffer chunk;
				len = (unsigned)std::sprintf(temp, "%llx\r\n", (unsigned long long)entity.size());
				chunk.put(temp, len);
				chunk.splice(entity);
				chunk.put("\r\n0\r\n\r\n");
				entity.swap(chunk);
			}
		}
		for(AUTO(it, headers.begin()); it != headers.end(); ++it){
			data.put(it->first.get());
			data.put(": ");
			data.put(it->second);
			data.put("\r\n");
		}
		data.put("\r\n");

		data.splice(entity);

		return on_encoded_data_avail(STD_MOVE(data));
	}