/* Copyright (C) 2001-2003 Paul Davis Copyright (C) 2005-2012 Grame Copyright (C) 2013 Samsung Electronics This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __jack_shm_android_h__ #define __jack_shm_android_h__ #include #include #include "types.h" #include "JackCompilerDeps.h" #include #include #ifdef __cplusplus extern "C" { #endif #define JACK_SHM_REGISTRY_FD -1 #define JACK_SHM_HEAP_ENOUGH_COUNT 300 void jack_instantiate(); #ifdef __cplusplus } #endif namespace android { class IAndroidShm; class Shm { public: static Shm* Instantiate(); virtual ~Shm(); private: Shm(); Shm( const Shm&); Shm& operator=(const Shm); private: void set_server_prefix (const char *server_name); int server_initialize_shm (int new_registry); int shm_lock_registry (void); void shm_unlock_registry (void); int access_registry (jack_shm_info_t *ri); void remove_shm (jack_shm_id_t *id); int create_registry (jack_shm_info_t *ri); int shm_validate_registry (); int GetUID(); int GetPID(); void shm_init_registry (); void release_shm_entry (jack_shm_registry_index_t index); jack_shm_registry_t * get_free_shm_info (); public: static void jack_shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t); static void jack_shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*); static int jack_release_shm_info (jack_shm_registry_index_t); static char* jack_shm_addr (jack_shm_info_t* si); static int jack_register_server (const char *server_name, int new_registry); static int jack_unregister_server (const char *server_name); static int jack_initialize_shm (const char *server_name); static int jack_initialize_shm_server (void); static int jack_initialize_shm_client (void); static int jack_cleanup_shm (void); static int jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result); static void jack_release_shm (jack_shm_info_t*); static void jack_release_lib_shm (jack_shm_info_t*); static void jack_destroy_shm (jack_shm_info_t*); static int jack_attach_shm (jack_shm_info_t*); static int jack_attach_lib_shm (jack_shm_info_t*); static int jack_attach_shm_read (jack_shm_info_t*); static int jack_attach_lib_shm_read (jack_shm_info_t*); static int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size); public: void shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t); void shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*); int release_shm_info (jack_shm_registry_index_t); char* shm_addr (unsigned int fd); // here begin the API int register_server (const char *server_name, int new_registry); int unregister_server (const char *server_name); int initialize_shm (const char *server_name); int initialize_shm_server (void); int initialize_shm_client (void); int cleanup_shm (void); int shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result); void release_shm (jack_shm_info_t*); void release_lib_shm (jack_shm_info_t*); void destroy_shm (jack_shm_info_t*); int attach_shm (jack_shm_info_t*); int attach_lib_shm (jack_shm_info_t*); int attach_shm_read (jack_shm_info_t*); int attach_lib_shm_read (jack_shm_info_t*); int resize_shm (jack_shm_info_t*, jack_shmsize_t size); private: static jack_shmtype_t jack_shmtype; static jack_shm_id_t registry_id; static jack_shm_fd_t registry_fd; static jack_shm_info_t registry_info; static jack_shm_header_t *jack_shm_header; static jack_shm_registry_t *jack_shm_registry; static char jack_shm_server_prefix[JACK_SERVER_NAME_SIZE+1]; static int semid; static pthread_mutex_t mutex; static Shm* ref; void jack_release_shm_entry (jack_shm_registry_index_t index); int jack_shm_lock_registry (void); void jack_shm_unlock_registry (void); //static sp mShmService; static sp mShmMemBase[JACK_SHM_HEAP_ENOUGH_COUNT]; public: static sp getShmService(); }; }; #endif /* __jack_shm_android_h__ */